工廠方法模式(Factory method pattern)
工廠方法模式正式定義 - 引用《HeadFirst 設計模式》
Define an interface for creating an object,but let subclasses decide
which class to instantiate.Factory Method lets a class defer
instantiation to subclasses.定義了一個創建對象的接口,但是由子類決定要實例化的類是那一個,其中的工廠方法讓類把實例化推遲到子類
在下列情況下可以使用Factory Method模式:
-引用《設計模式 - 可復用面向對象軟件的基礎》
1. 當一個類不知道它所必須創建的對象的類的時候。
2. 當一個類希望由它的子類來指定它所創建的對象的時候。
3. 當類將創建對象的職責委托給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
參與者
1 Product
—定義工廠方法所創建的對象的接口。
2 ConcreteProduct
—實現Product接口。
3 Creator
—聲明工廠方法,該方法返回一個Product類型的對象。Creator也可以定義一個工廠方
法的缺省實現,它返回一個缺省的ConcreteProduct對象。
—可以調用工廠方法以創建一個Product對象。
4 ConcreteCreator
—重定義工廠方法以返回一個ConcreteProduct實例。
class product
{
public:
virtual void do() = 0;
};
class concrete_product_1 : public product
{
public:
void do()
{
//關於產品1的處理
}
};
class concrete_product_2 : public product
{
public:
void do()
{
//關於產品2的處理
}
};
class creator
{
public:
virtual product *create_product() = 0;
};
class concrete_creator_1 : public creator
{
public:
product *create_product()
{
return new concrete_product_1 ();
}
};
class concrete_creator_2 : public creator
{
public:
product *create_product()
{
return new concrete_product_2 ();
}
};
//使用
creator *c1 = new concrete_creator_1 ();
product *p1 = c1->create_product();
p1->do();
creator *c2 = new concrete_creator_2 ();
product *p2 = c2->create_product();
p2->do();
當增加產品3的時候,只要再concrete_creator_3和concrete_product_3就可以了,與產品1和產品2無關