**定義**:工廠方法模式(FactoryMethod Pattern),定義一個用于創建對象的接口,讓子類決定實例化哪一個類。定義一個抽象工廠類,每一個產品,按照抽象工廠的基本要求新建一個工廠來生產新的產品。
類型:創建型模式。
類圖:
****
**參與角色**:
1. AbstrctProduct,提供產品生產的標準接口。
1. ConcreteProductA,ConcreteProductB,按接口具體去實現生產的產品。
1. AbstractFactory,提供標準工廠規模的抽象工廠。
1. ConcreteFactoryA,ConcreteFactoryB,按接口標準定制的具體生產產品的在廠。
**概述**:
????????簡單工廠模式,在使用時,會違背OCP原則。工廠方法模式就是為了解決這一問題而產生的。每當有一個新的產品要生產時,不用去更改原有的產品線,也不用去修改原有的工廠,一切按規定析添加。這樣產品的生產流程一致,新工廠的建造也一致。工廠原有的生產管理方法便可以繼續使用,而且人員也不用重新培訓,就可以直接上崗。
????????因為當增加新的訂單時,不需要去更改舊有的產品線以及工廠,這樣就可以最大限度的保證原有的產品能夠正常運行。這一點,就是工廠方法的核心。下面就以代碼來展現這一過程。
**代碼**:
~~~
// C++
#include?<iostream>
#include?<afxcom_.h>?
using?namespace?std;
class?CCellPhone
{
public:
???virtual?void?ProducePhone()
???{
???????cout<<"Produce?Normal?Phone."<<endl;
???}
};
class?CNokia?:?public?CCellPhone
{
public:
???virtual?void?ProducePhone()
???{
???????cout<<"Produce?Nokia?Phone."<<endl;
???}
};
class?CSamsung?:?public?CCellPhone
{
public:
???virtual?void?ProducePhone()
???{
???????cout<<"Produce?Samsung?Phone."<<endl;
???}
};
class?CPhoneFactory
{
public:
???virtual?CCellPhone*?CreatePhone()?=?0;
};
class?CNokiaFactory?:?public?CPhoneFactory
{
public:
???virtual?CCellPhone*?CreatePhone()
???{
???????CCellPhone?*pPhone?=?new?CNokia();
???????return?pPhone;
???}
};
class?CSamsungFactory?:?public?CPhoneFactory
{
public:
???virtual?CCellPhone*?CreatePhone()
???{
???????CCellPhone?*pPhone?=?new?CSamsung();
???????return?pPhone;
???}
};
int?_tmain(int?argc,?_TCHAR*?argv[])
{
???//?Nokia?cellphone?production?line
???CPhoneFactory*?pNokiaFactory?=?new?CNokiaFactory();
???CCellPhone*?pNokiaPhone?=?pNokiaFactory->CreatePhone();
???pNokiaPhone->ProducePhone();
???//?Samsung?cellphone?production?line
???CPhoneFactory*?pSamsungFactory?=?new?CSamsungFactory();
???CCellPhone*?pSamsungPhone?=?pSamsungFactory->CreatePhone();
???pSamsungPhone->ProducePhone();
???delete?pNokiaPhone;
???pNokiaPhone?=?NULL;
???delete?pSamsungPhone;
???pSamsungPhone?=?NULL;
???return?0;
}
//?C#代碼
using?System;
using?System.Collections.Generic;
using?System.Text;
using?System.Diagnostics;
namespace?Phone
{
???public?class?CellPhone
???{
???????public?virtual?void?ProducePhone()
???????{
???????????Console.WriteLine("Produce?Normal?Phone.");
???????}
???}
???class?Nokia?:?CellPhone
???{
???????public?override?void?ProducePhone()
???????{
???????????Console.WriteLine("Produce?Nokia?Phone.");
???????}
???}
???class?Samsung?:?CellPhone
???{
???????public?override?void?ProducePhone()
???????{
???????????Console.WriteLine("Produce?Samsung?Phone.");
???????}
???}
???public?interface?IFactory
???{
???????CellPhone?CreatePhone();
???}
???public?class?NokiaFactory?:?IFactory
???{
???????public?CellPhone?CreatePhone()
???????{
???????????CellPhone?phone?=?new?Nokia();
???????????return?phone;
???????}
???}
???public?class?SamsungFactory?:?IFactory
???{
???????public?CellPhone?CreatePhone()
???????{
???????????CellPhone?phone?=?new?Samsung();
???????????return?phone;
???????}
???}
???class?Program
???{
???????static?void?Main(string[]?args)
???????{
???????????IFactory?nokiaFactory?=?new?NokiaFactory();
???????????CellPhone?phone?=?nokiaFactory.CreatePhone();
???????????phone.ProducePhone();
???????????IFactory?samsungFactory?=?new?SamsungFactory();
???????????phone?=?samsungFactory.CreatePhone();
???????????phone.ProducePhone();
???????}
???}
}
package?CellPhone;
public?interface?IFactory?{
???IPhone?createPhone();
}
package?CellPhone;
public?interface?IPhone?{
???void?producePhone();
???
}
package?CellPhone;
public?class?NokiaFactory?implements?IFactory?{
???public?IPhone?createPhone()
???{
???????IPhone?phone?=?new?NokiaPhone();
???????
???????return?phone;
???}
}
package?CellPhone;
public?class?NokiaPhone?implements?IPhone?{
???public?void?producePhone()
???{
???????System.out.println("Produce?nokia?phone.");
???}
}
package?CellPhone;
public?class?SamsungFactory?implements?IFactory?{
???public?IPhone?createPhone()
???{
???????IPhone?phone?=?new?SamsungPhone();
???????
???????return?phone;
???}
}
package?CellPhone;
public?class?SamsungPhone?implements?IPhone?{
???public?void?producePhone()
???{
???????System.out.println("Produce?samsung?phone.");
???}
}
/**
*?CellPhone.java
*/
package?CellPhone;
/**
*?@author?feihe027@163.com
*
*/
public?class?CellPhone?{
???/**
????*?@param?args
????*/
???public?static?void?main(String[]?args)?{
???????//?TODO?Auto-generated?method?stub
???????IFactory?factory?=?new?NokiaFactory();
???????IPhone?phone?=?factory.createPhone();
???????phone.producePhone();
???????
???????factory?=?new?SamsungFactory();
???????phone?=?factory.createPhone();
???????phone.producePhone();
???}
}
~~~
**優缺點**:
1. 優點,能夠最大限度地保證對修改關閉,對擴展開放。新的產品,都是通過新添加代碼來完成而不是去修改原有代碼來完成。
1. 缺點,每添加一個新產品,就新建一個工廠,稍顯有點浪費。如果工廠過多,管理工廠也會成為一件麻煩事。抽象工廠模式正好解決這一問題。
**參考資料**:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《Java與模式》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結