Factory Method(工厂方法)-对象创建型模式
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(工厂方法)-对象创建型模式的更多相关文章
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的 ...
- Factory Method 工厂方法模式
Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- 设计模式(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) - ...
- 3.Factory Method 工厂方法模式(创建型模式)
1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟到子类. 2.实现代码如下: /// <summary> /// 工厂方 ...
- Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...
- c++ 设计模式8 (Factory Method 工厂方法)
5. “对象创建”类模式 通过“对象创建”类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: ...
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)
动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...
随机推荐
- SocketTcpServer
自定义SocketTcpServer,虽然现在有很多这样的组件,但是有时候还是需要把它集成在你的框架或者产品中,不需要特别强大的功能,根据需求定制.最基本的一个问题是判断数据包的结束,没有像super ...
- SQL Server DBA日常查询视图_数据库对象视图
1.数据库 use master; exec sp_helpdb 1.1查询数据库大小 1.2查询数据库状态 use msdb select name, user_access_desc, --用户访 ...
- 【转】Linux CentOS内核编译:下载CentOS源码、编译2.6.32-220的错误(apic.c:819 error 'numi_watchdog' undeclared)
一.下载CentOS源码 1.1 查看CentOS版本 cat /etc/issue 1.2 查看Linux内核版本 uname -r 1.3 下载 文件名:kernel-2.6.32-220.el6 ...
- Charles 3.11.5 绿色特别版
Charles 3.11.5 绿色特别版,注册码在key文本中 链接: http://pan.baidu.com/s/1hsoFcyS 密码: q6e1
- JavaScript 输入内容就触发事件
<textarea name="textarea" placeholder="请输入产品识别号" onkeyup="alert();" ...
- 浅谈可扩展性框架:MEF
之前在使用Prism框架时接触到了可扩展性框架MEF(Managed Extensibility Framework),体验到MEF带来的极大的便利性与可扩展性. 此篇将编写一个可组合的应用程序,帮助 ...
- Objective-C语法之KVO的使用
简介: 上篇我们讲到了KVC,这篇我们学习KVO,全名为:Key Value Observing,直译为:基于键值的观察者. 那它有什么用呢?KVO主要用于视图交互方面,比如界面的某些数据变化了,界面 ...
- 黑马程序员_JAVA之交通灯管理系统
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.一.需求:模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路 ...
- Chap4: question: 19 - 28
19. 二叉树的镜像(递归) 即:交换所有节点的左右子树.从下往上 或 从上往下 都可以. #include <iostream> #include <string> usin ...
- JavaScript笔记:数据类型
javascript中有5种基本数据类型:Undefined,Null,Boolean,Number和String,还有一种复杂的数据类型--Object.javascript不支持任何创建自定义类型 ...