1.意圖 定義一個用於創建對象的介面,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。 2.動機 框架使用抽象類定義和維護對象之間的關係。這些對象的創建通常也由框架負責。 3.適用性 當一個類不知道它所必須創建的對象的類的時候。 當一個類希望由它的子類來指定它所創 ...
1.意圖
定義一個用於創建對象的介面,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。
2.動機
框架使用抽象類定義和維護對象之間的關係。這些對象的創建通常也由框架負責。
3.適用性
- 當一個類不知道它所必須創建的對象的類的時候。
- 當一個類希望由它的子類來指定它所創建的對象的時候。
- 當類將創建對象的職責委托給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一局部化的時候。
4.結構
5.代碼實例
class Product
{
public:
virtual ~Product() = 0;
};
class OneProduct : public Product
{
public:
OneProduct();
};
class TwoProduct : public Product
{
public:
TwoProduct();
};
class ThreeProduct : public Product
{
public:
ThreeProduct();
};
class FourProduct : public Product
{
public:
FourProduct();
};
Product.h
#include <memory>
class Product;
class Creator
{
public:
virtual std::shared_ptr<Product> FactoryMethod() = 0;
};
class OneCreator : public Creator
{
public:
std::shared_ptr<Product> FactoryMethod();
};
class TwoCreator : public Creator
{
public:
std::shared_ptr<Product> FactoryMethod();
};
class ThreeCreator : public Creator
{
public:
std::shared_ptr<Product> FactoryMethod();
};
class FourCreator : public Creator
{
public:
std::shared_ptr<Product> FactoryMethod();
};
Creator.h
#include "Product.h"
#include <iostream>
Product::~Product()
{
}
OneProduct::OneProduct()
{
std::cout << "OneProduct Created" << std::endl;
}
TwoProduct::TwoProduct()
{
std::cout << "TwoProduct Created" << std::endl;
}
ThreeProduct::ThreeProduct()
{
std::cout << "ThreeProduct Created" << std::endl;
}
FourProduct::FourProduct()
{
std::cout << "FourProduct Created" << std::endl;
}
Product.cpp
#include "Creator.h"
#include "Product.h"
std::shared_ptr<Product> OneCreator::FactoryMethod()
{
auto pProduct = std::shared_ptr<Product>(new OneProduct());
return pProduct;
}
std::shared_ptr<Product> TwoCreator::FactoryMethod()
{
auto pProduct = std::shared_ptr<Product>(new TwoProduct());
return pProduct;
}
std::shared_ptr<Product> ThreeCreator::FactoryMethod()
{
auto pProduct = std::shared_ptr<Product>(new ThreeProduct());
return pProduct;
}
std::shared_ptr<Product> FourCreator::FactoryMethod()
{
auto pProduct = std::shared_ptr<Product>(new FourProduct());
return pProduct;
}
Creator.cpp
#include<memory>
#include"Creator.h"
int main()
{
auto pOneCreator = std::shared_ptr<OneCreator>(new OneCreator());
auto pOneProduct = pOneCreator->FactoryMethod();
auto pTwoCreator = std::shared_ptr<TwoCreator>(new TwoCreator());
auto pTwoProduct = pTwoCreator->FactoryMethod();
auto pThreeCreator = std::shared_ptr<ThreeCreator>(new ThreeCreator());
auto pThreeProduct = pThreeCreator->FactoryMethod();
auto pFourCreator = std::shared_ptr<FourCreator>(new FourCreator());
auto pFourProduct = pFourCreator->FactoryMethod();
while(1);
}
Test.cpp
6.測試結果
7.效果
- 優點:代碼僅處理Product介面,不再綁定特定的ConcreteProduct。
- 缺點:一個工廠方法僅創建一種產品,創建特定的ConcreteProduct需要創建Creator的子類。
8.變形
工廠方法的變形是:可以參數化工廠方法,以使工廠方法可以創建多種產品。