1.意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

2.动机

框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。

3.适用性

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候。

4.结构

5.代码实例

class Product
{
public:
virtual ~Product() = ;
}; 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() = ;
}; 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();
}

Test.cpp

6.测试结果

7.效果

  • 优点:代码仅处理Product接口,不再绑定特定的ConcreteProduct。
  • 缺点:一个工厂方法仅创建一种产品,创建特定的ConcreteProduct需要创建Creator的子类。

8.变形

工厂方法的变形是:可以参数化工厂方法,以使工厂方法可以创建多种产品。

最新文章

  1. MySQL 外键
  2. 实战 -- Redis2.4.2集成spring3.2.2
  3. [vijos P1112] 小胖的奇偶
  4. uva 12096 The SetStack Computer
  5. Eclipse使用新手教程
  6. 配置trac
  7. Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)
  8. [置顶] 和孩子们一起学Python编程
  9. 【javaFX学习】(一) 建一个简单的界面
  10. Android通过编译源代码提供系统服务-android学习之旅(85)
  11. 『高性能模型』Roofline Model与深度学习模型的性能分析
  12. Netty学习问题总结
  13. Open_stack 有虚拟机端口不通的问题
  14. HCatalog 学习之路
  15. 剑指offer63:数据流中的中位数
  16. Vue Cli 中使用 Karma / Chrome 执行样式相关单元测试
  17. UT-Austin大学在Image search and large-scale retrieval方面的一系列papers
  18. jq 跳转方式汇总
  19. 第三章 线程安全的DateFormat工具类
  20. 【Leetcode】【Medium】Unique Binary Search Trees II

热门文章

  1. 034. asp.netWeb用户控件之三通过用户控件实现用户注册和登录
  2. SpringMVC学习系列(7) 之 格式化显示
  3. 北京VR视频外包团队:全景VR视频科普
  4. 创建MySQL 用户
  5. Dictionary&lt;TKey, TValue&gt; 类
  6. [Tex学习笔记]一个数学公式
  7. netbean7.2 改变maven插件的中心库地址
  8. C# 文件大小
  9. 2. xargs 命令
  10. 洛谷P3372 【模板】线段树 1