[GeekBand] 設計模式——工廠模式學習筆記

         本文參考文獻:GeekBand課堂內容,授課老師:李建忠設計模式

                                      :大話設計模式函數

 

其他的模式方法請自行查看Geekband相關課程,在此不累述。字體

 

這周的課題是:this

  針對DrawingSystem中的基類Shape和各個子類Line、Rec、Circle。爲支持更多的形狀子類,請使用某種模式來支持靈活地建立它們。使用鬆耦合面向對象設計方法和思想,可以使用僞碼錶示設計。spa

  課程中提到了四種模式,「工廠方法」、「抽象工廠」、「原型模式」、「構建器」模式。最後聚焦在了「工廠方法」和「抽象工廠」這兩種方法,那麼第一個問題就是「工廠方法」、「抽象工廠」區別與聯繫?.net

 

1、工廠方法和抽象工廠區別:

工廠模式:定義一個用於建立對象的接口,讓子類決定實例化哪個類設計

抽象工廠模式:爲建立一組相關或相互依賴的對象提供一個接口,並且無需指定他們的具體類code

這裏有更爲詳細的解釋:orm

                               http://blog.csdn.net/wyxhd2008/article/details/5597975對象

總之,關鍵字在於相互依賴的對象,多個業務層次」,而本題中,各個子類之間並無說明之間有相互依賴的關係,故最終決定採用工廠方法模式

 

2、結構圖

 

                         

 

 

3、經過代碼和上述結構分析

普通的調用關係爲:

在函數中,普通的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、小結

 

一、工廠模式用於隔離對象的使用者和具體類型之間的耦合關係。(紅色字體部分)

 

二、工廠模式經過面向對象的方法,將所要建立的具體對象延遲到子類,從而實現一種擴展(而非更改)的策略,較好的解決了這種緊耦合的關係

 

三、工廠模式解決單個對象的需求變化,缺點在於要求建立的方法和參數相同

相關文章
相關標籤/搜索