工厂方法模式(Product)C++实现
意图:定义一个用于创建对象的接口,让子类觉定实例化哪一个类。
适用性:1.一个类不知道它必须创建的对象的时候。
2.一个类希望由它的子类指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将那一个帮助子类是代理者这一信息局部化的时候。
效果: 1.提供对象的扩展版本。
2.连接平行的类层次。
今天学工厂方法模式,感觉得从几个工厂模式一起去理解,所以我整体的讲一下自己的想法。
开始,老板要求按客户意愿产生对应产品。于是有简单工厂,代码如下:
#ifndef _PRODUCT_
#define _PRODUCT_
#include <string>
using namespace std; class AbsProduct{
public:
AbsProduct(){}
virtual string GetProduct() = ;
}; class Product_A:public AbsProduct{
public:
Product_A(){}
virtual string GetProduct(){return "Product_A";}
}; class Product_B:public AbsProduct{
public:
Product_B(){}
virtual string GetProduct(){return "Product_B";}
}; class Product_C:public AbsProduct{
public:
Product_C(){}
virtual string GetProduct(){return "Product_C";}
}; #endif
产品部分代码
工厂部分代码:
#ifndef _FACTORY_
#define _FACTORY_
#include "Product.h" class Factory{
public:
Factory(){}
AbsProduct* MakeProduct(char ch)
{
switch (ch)
{
case 'A':
return new Product_A;
break;
case 'B':
return new Product_B;
break;
case 'C':
return new Product_C;
break;
default:
break;
}
}
}; #endif
实现部分:
#include <iostream>
#include <string>
using namespace std;
#include "Factory.h"
#include "Product.h" int main()
{
Factory factory;
AbsProduct* product = factory.MakeProduct('A');
cout<<product->GetProduct()<<endl; product = factory.MakeProduct('B');
cout<<product->GetProduct()<<endl; product = factory.MakeProduct('C');
cout<<product->GetProduct()<<endl;
return ;
}
有一天,老板又要求: 将新产品 Product_D 加入到生产。简单工厂模式虽然满足了按要求生产对应的产品,
但无法扩展新产品。于是实现了工厂方法模式:
首先产品部分添加Product_D :
class Product_D:public AbsProduct{
public:
Product_D(){}
virtual string GetProduct(){return "Product_D";}
};
工厂部分改为:
class AbsFactory{
public:
AbsFactory(){}
virtual AbsProduct* MakeFroduct() = ;
};
class Factory_A:public AbsFactory{
public:
Factory_A(){}
virtual AbsProduct* MakeFroduct(){return new Product_A;}
};
class Factory_B:public AbsFactory{
public:
Factory_B(){}
virtual AbsProduct* MakeFroduct(){return new Product_B;}
};
class Factory_C:public AbsFactory{
public:
Factory_C(){}
virtual AbsProduct* MakeFroduct(){return new Product_C;}
};
class Factory_D:public AbsFactory{
public:
Factory_D(){}
virtual AbsProduct* MakeFroduct(){return new Product_D;}
};
工厂方法工厂部分代码
实现部分:
#include <iostream>
#include <string>
using namespace std;
#include "Factory.h"
#include "Product.h" int main()
{
AbsFactory* factory = new Factory_A;
AbsProduct* product = factory->MakeFroduct();
cout<<product->GetProduct()<<endl; factory = new Factory_B;
product = factory->MakeFroduct();
cout<<product->GetProduct()<<endl; factory = new Factory_C;
product = factory->MakeFroduct();
cout<<product->GetProduct()<<endl; factory = new Factory_D;
product = factory->MakeFroduct();
cout<<product->GetProduct()<<endl; return ;
}
老板又要求了,“现在我们公司就主打这四个产品了,你们要定期更新这些产品。”
这样工厂方法虽然满足了按客户要求生产对应产品,而且也满足了扩展新产品的要求,
但无法满足新产品的更新换代。于是抽象工厂模式出来了......
对于我们的例子而已,假设公司的产品A1,B1,C1,D1为一起产品,A2,B2,C2,D2为二期产品。
则A1,A2,A3......为同一族产品。而A1,B1,C1,D1为同一等级产品。如果只工厂生产同一等级
产品,则是工厂方法模式。如果产生了不同等级产品则为抽象工厂模式。
工厂方法模式(Product)C++实现的更多相关文章
- C#设计模式系列:工厂方法模式(Factory Method)
1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...
- 【2016-10-17】【坚持学习】【Day8】【工厂方法模式】
工厂方法模式又叫工厂模式,虚拟构造器模式 定义: 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该 ...
- (二)工厂方法模式-C++实现
工厂方法模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类. Factory method使一个类的实例化延迟到子类. 当系统准备为用户提供某个类的子类的实例,又不想让用户代码和孩子类形成耦合 ...
- 深入浅出设计模式——工厂方法模式(Factory Method)
介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- C#设计模式——工厂方法模式(Factory Method Pattern)
一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...
- 六个创建模式之工厂方法模式(Factory Method Pattern)
问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- 工厂方法模式(FACTORY METHOD)
核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦.复用和方便后期维护拓展的目的. 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接 ...
随机推荐
- Pjax无刷新跳转页面实现,支持超链接与表单提交
什么是pjax? 当你点击一个站内的链接的时候,不是做页面跳转,而是只是站内页面刷新.这样的用户体验,比起整个页面都闪一下来说, 好很多. 其中有一个很重要的组成部分, 这些网站的ajax刷新是支持浏 ...
- webpack学习(六)—webpack+react+es6(第2篇)
接上篇 webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...
- 【Shell编程】Shell基本语法
Shell 语法 Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...
- 【剑指Offer】18、二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为原二叉树的镜像. 解题思路: 求一棵树的镜像的过程:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点.当交换完所有的非 ...
- Parsing error: The keyword 'export' is reserved && error Parsing error: Unexpected token <
如果你也在使用eslint,也报了如上错误,可以尝试: $ npm install babel-eslint --save-dev 然后,加上: rules: { "parser" ...
- code runner运行终端的目录设置
我的github:swarz,欢迎给老弟我++星星 该设置属性为 "code-runner.fileDirectoryAsCwd": true 设置为 true后,终端默认目录为运 ...
- 【ownCloud】添加信任域
如果在安装ownCloud后,更换了访问方式,比如刚开始是http://127.0.0.1/owncloud,变成了http://1.1.1.1/owncloud,那么在访问时可能得到这样的页面: 您 ...
- sqlalchemy带条件查询相关应用
sqlalchemy带条件查询 filter_by与filter filter_by 与filter的区别: 1. filter_by只能取值= filter可以==,!=,>=,<=等多 ...
- Django(六)
一.一大波model操作 1. 创建数据库表 # 单表 # app01_user ==> tb1 # users class User(models.Model): name = models. ...
- maven 自动部署到tomcat
使用maven的自动部署功能可以很方便的将maven工程自动部署到远程tomcat服务器,减少部署时间,方便快捷. 一.配置tomcat manager 1.编辑tomcat目录下,conf/tomc ...