天天看點

抽象工廠,工廠方法,簡單工廠對比

抽象工廠,工廠方法,簡單工廠對比

建立型類模式将一個對象的部分建立工作延遲到子類,而建立型對象模式則将它延遲到另一個對象中。

建立型:使得動态建立對象更靈活

結構型:添加第三方類降低耦合

行為型:滿足對象之間的動态行為特征

一、工廠方法-建立型類模式

http://blog.163.com/zhoumhan_0351/blog/static/3995422720104277410773

class Product{//定義産品的抽象類

public:

Product(){}

    //...一些操作

}

class Product1:public Product{//具體産品

public:

Product1(){}

//...一些操作

}

class Product2:public Product{//具體産品

public:

Product1(){}

//...一些操作

}

class Creator{//抽象類

public:

Creator(){}//可以定義一些預設操作

virtual Product* Create(ProductId);//工廠方法

//...

//一些操作,比如對傳回的Product進行操作,或者對建立Product

//的一些輔助操作,都可以聲明為virtual

}

class Creator1:public Creator{//具體應用1

public:

Creator1(){}//可以定義一些預設操作

    Product* Create(ProductId);//工廠方法

//...

//一些操作,比如對傳回的Product進行操作,或者對建立Product

//的一些輔助操作,都可以聲明為virtual

}

class Creator2:public Creator{//具體應用2

public:

Creator2(){}//可以定義一些預設操作

    Product* Create(ProductId);//工廠方法

//...

//一些操作,比如對傳回的Product進行操作,或者對建立Product

//的一些輔助操作,都可以聲明為virtual

}

通過工廠方法,将一個對象的部分建立工作延遲到子類,解耦産品的實作和使用。友善了産品改變。

二、簡單工廠

給工廠方法參數化,則稱為簡單工廠。

Product* Creator::Create(ProductId ID){

if(MINE==id) return new MyProduct;

if(YOURS==id) return new YourProduct;

//...

return 0;

類建立型模式之工廠方法(Factory Method)

http://blog.163.com/zhoumhan_0351/blog/static/39954227201031393276

三、抽象工廠-對象建立型模式

提供一個建立一系列相關或互相依賴對象的接口,而無需指定它們具體的類。

建立型模式簡介

http://blog.163.com/zhoumhan_0351/blog/static/3995422720104277410773/

常常用工廠方法實作抽象工廠中具體的工廠。

class AbstractProductA{

public:

AbstractProductA(){}

//...

}

class AbstractProductA1:public AbstractProductA{

public:

AbstractProductA1(){}

//...

}

class AbstractProductA2:public AbstractProductA{

public:

AbstractProductA2(){}

//...

}

class AbstractProductB{

public:

AbstractProductB(){}

//...

}

class AbstractProductB1:public AbstractProductB{

public:

AbstractProductB1(){}

//...

}

class AbstractProductB2:public AbstractProductB{

public:

AbstractProductB2(){}

//...

}

class AbstractFactory{

AbstractFactory(){}

//下面每一個接口通常都是通過工廠方法來實作

virtual AbstractProductA* CreateProcudtA(){}//=0

virtual AbstractProductB* CreateProcudtB(){}//=0

//...

}

class ConcreteFactory1{

ConcreteFactory1(){}

//下面每一個接口通常都是通過工廠方法來實作

virtual AbstractProductA* CreateProcudtA(){}

virtual AbstractProductB* CreateProcudtB(){}

//...

}

class ConcreteFactory2{

ConcreteFactory2(){}

//下面每一個接口通常都是通過工廠方法來實作

virtual AbstractProductA* CreateProcudtA(){}

virtual AbstractProductB* CreateProcudtB(){}

//...

}

    由此,我們可以看到,抽象工廠作為對象型建立模式,主要提供建立所需對象的一系列接口(這些接口通常通過工廠方法實作),這些對象通過組合方式來組建對象。缺點是如果使用者擴充接口,則抽象工廠需要改變。

而工廠方法作為類建立型模式,通過繼承來建立對象,将一個類的執行個體化延遲到其子類。

兩者都封裝對象建立,來實作使用者與所使用的具體産品(使用者與産品)之間的解耦。

四、OO Principles

封裝變化的量

組合優先于繼承

面向接口程式設計,而非實作

尋求對象繼承間的松耦合

Classes should be open for extension but closed for modification

幾個與設計模式相關的基本概念和原則

http://blog.163.com/zhoumhan_0351/blog/static/399542272010230103414517

設計模式基本原則

http://blog.163.com/zhoumhan_0351/blog/static/3995422720105655438106

繼續閱讀