本文參考文獻:GeekBand課堂內容,授課老師:李建忠設計模式
:大話設計模式函數
其他的模式方法請自行查看Geekband相關課程,在此不累述。字體
這周的課題是:this
針對DrawingSystem中的基類Shape和各個子類Line、Rec、Circle。爲支持更多的形狀子類,請使用某種模式來支持靈活地建立它們。使用鬆耦合面向對象設計方法和思想,可以使用僞碼錶示設計。spa
課程中提到了四種模式,「工廠方法」、「抽象工廠」、「原型模式」、「構建器」模式。最後聚焦在了「工廠方法」和「抽象工廠」這兩種方法,那麼第一個問題就是「工廠方法」、「抽象工廠」區別與聯繫?.net
工廠模式:定義一個用於建立對象的接口,讓子類決定實例化哪個類設計
抽象工廠模式:爲建立一組相關或相互依賴的對象提供一個接口,並且無需指定他們的具體類code
這裏有更爲詳細的解釋:orm
http://blog.csdn.net/wyxhd2008/article/details/5597975對象
總之,關鍵字在於「相互依賴的對象,多個業務層次」,而本題中,各個子類之間並無說明之間有相互依賴的關係,故最終決定採用工廠方法模式
普通的調用關係爲:
在函數中,普通的new 關係,實際上將ashape 與 Circle() 耦合,每次需求改變都要從新修改源代碼,這樣很是不適合軟件的迭代。
Shape * ashape = new Circle();
而在工廠模式中,以下述代碼,紅色代碼,這是鬆耦合設計的思想。
class MainForm : public Form { ShapeFactory* factory;//工廠 public: MainForm(ShapeFactory* factory) { this->factory = factory; } virtual ~MainForm(); void MainCreate() { //多態new Shape * ashape =factory->CreateShape(); //獲取No ashape->GetNo(); } };
那麼怎麼實現的呢?
對應上圖,咱們實現了下面四段代碼,分別是抽象的Shape 、ShapeFactory、具體的子類 、如Circle、具體的子類工廠如、CircleFactory
class Shape { public: Shape(int no = 0) :no_(){} virtual ~Shape(){} int GetNo(){ return no_; } int SetNo(int no_){} private: int no_; };
class ShapeFactory { public: ShapeFactory(); virtual Shape * CreateShape() = 0; virtual ~ShapeFactory(){} };
//具體類 class Line : public Shape { public: Line(){} virtual ~Line(){} }; class Rec : public Shape { public: Rec(){} virtual ~Rec(){} }; class Circle : public Shape { public: Circle(){} virtual ~Circle(){} };
//具體工廠 class LineFactory : public ShapeFactory { public: LineFactory(); virtual ~LineFactory(); virtual Shape* CreateShape() { return new Line(); } }; class RecFactory : public ShapeFactory { public: RecFactory(); virtual ~RecFactory(); virtual Shape* CreateShape() { return new Rec(); } }; class CircleFactory : public ShapeFactory { public: CircleFactory(); virtual ~CircleFactory(); virtual Shape* CreateShape() { return new Circle(); } };
4、小結
一、工廠模式用於隔離對象的使用者和具體類型之間的耦合關係。(紅色字體部分)
二、工廠模式經過面向對象的方法,將所要建立的具體對象延遲到子類,從而實現一種擴展(而非更改)的策略,較好的解決了這種緊耦合的關係
三、工廠模式解決單個對象的需求變化,缺點在於要求建立的方法和參數相同