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.变形

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

Factory Method(工厂方法)-对象创建型模式的更多相关文章

  1. 设计模式C++学习笔记之五(Factory Method工厂方法模式)

      工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的 ...

  2. Factory Method 工厂方法模式

    Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...

  3. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  4. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  5. 3.Factory Method 工厂方法模式(创建型模式)

    1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟到子类. 2.实现代码如下: /// <summary> /// 工厂方 ...

  6. Factory Method工厂方法模式

    定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...

  7. c++ 设计模式8 (Factory Method 工厂方法)

    5. “对象创建”类模式 通过“对象创建”类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: ...

  8. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  9. C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)

    动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...

随机推荐

  1. 关于 MaxScript 获取所有贴图

    相关内容记录在官方文档 BitmapTexture : TextureMap 中 fn allUsedMaps = ( sceneMaps = usedMaps() for m in meditmat ...

  2. 装饰模式(Decorate Pattern)

    在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式 ...

  3. Discovering the Computer Science Behind Postgres Indexes

    This is the last in a series of Postgres posts that Pat Shaughnessy wrote based on his presentation ...

  4. Squid代理服务器的安装与配置

    一.简介 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据.当一个用 ...

  5. linux -小记(1) 问题:"linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示“ eth0 似乎不存在, 初始化操作将被延迟”。

    "linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示" eth0 似乎不存在, 初始化操作将被延迟" . 问题 1. service n ...

  6. javascript 刷新当前页面

    编辑器加载中... 1. window.location.replace(window.location.href)

  7. Spark RDD类源码阅读

    每天进步一点点~开搞~ abstract class RDD[T: ClassTag]( //@transient 注解表示将字段标记为瞬态的 @transient private var _sc: ...

  8. linux gcc头文件搜索路径

    #include <>: 直接到系统指定的某些目录中去找某些头文件.#include "": 先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件 1. ...

  9. 【javascript基础】6、new与构造函数

    前言 上篇说创建对象的时候提到了带返回值的构造函数,那里没有和大家说这个问题,今天就和大家一起学习构造函数和new操作符.我也是最近才稍微弄明白点这个构造函数,以前总是忽略一些问题,现在就是想到哪块不 ...

  10. 标准盒模型与IE盒模型之间的转换

    首先上图,这两张很明显可以看出IE盒模型和标准盒模型之间的差别. 当然今天不是去细细追究两种模型具体是怎么去计算布局的,那个很多文章已经已经有过了,不再重复.以前刚开始学习盒模型的时候,就学到的是IE ...