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.变形
工厂方法的变形是:可以参数化工厂方法,以使工厂方法可以创建多种产品。
原标题:Factory Method(工厂方法)
关键词: