工厂模式(factory pattern)
工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory)、工厂方法(factory method)、抽象工厂(abstract factory)。
简单工厂包括3种组成元素:抽象产品、具体产品、具体工厂(简单工厂),结构图如下:

C++实现:
//抽象产品
class Car {
public:
virtual string getDescription() = ;
};
//具体产品
class Audi : public Car {
public:
string getDescription() { return "Audi"; }
}; class BMW : public Car {
public:
string getDescription() { return "BMW"; }
}; class Ford : public Car {
public:
string getDescription() { return "Ford"; }
}; class Hummer : public Car {
public:
string getDescription() { return "Hummer"; }
}; class Toyota : public Car {
public:
string getDescription() { return "Toyota"; }
}; class Bentley : public Car {
public:
string getDescription() { return "Bentley"; }
};
//简单工厂
class CarFactory {
public:
Car* createCar(string name) {
if (name == "Audi")
return new Audi;
else if (name == "BMW")
return new BMW;
else if (name == "Ford")
return new Ford;
else if (name == "Hummer")
return new Hummer;
else if (name == "Toyota")
return new Toyota;
else if (name == "Bentley")
return new Bentley;
}
}; int main()
{
CarFactory factory;
Car *mycar = factory.createCar("Audi");
cout << mycar->getDescription() << endl;
mycar = factory.createCar("BMW");
cout << mycar->getDescription() << endl;
delete mycar;
}
可以看出,在简单工厂模式下,一个具体的工厂负责所有具体产品的创建,适用于产品种类较少的情况。当新增产品时,我们需要修改简单工厂的实现逻辑,违背了开放关闭原则。
工厂方法模式在简单工厂模式基础上,增加了一个抽象工厂。

抽象工厂只定义了创建对象的接口,由具体子类负责具体对象的创建。
C++实现:
//抽象工厂
class CarFactory {
public:
virtual Car* createCar() = ;
};
//具体工厂
class AutiCarFactory : public CarFactory {
public:
Car* createCar() { return new Audi; }
}; class BMWCarFactory : public CarFactory {
public:
Car* createCar() { return new BMW; }
}; int main()
{
CarFactory *pcf = new AutiCarFactory;
Car *c = pcf->createCar();
cout << c->getDescription() << endl;
delete pcf; pcf = new BMWCarFactory;
c = pcf->createCar();
cout << c->getDescription() << endl;
delete pcf;
}
在工厂方法模式下,当新增一个产品种类时,只需要创建一个新的产品类和一个新的对应工厂类即可,没有破坏原有代码,遵循了开放关闭原则。
抽象工厂模式比较抽象,为此引入以下两个概念:
产品等级结构:
产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:
在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
此时再贴张结构图就更清晰了:

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,
一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品
族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
抽象工厂的一个应用是:在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。
抽象工厂的一个缺点是:增加新的工厂和产品族容易,增加新的产品等级结构麻烦。
reference:
http://design-patterns.readthedocs.org/zh_CN/latest/creational_patterns/abstract_factory.html
Simple Factory Vs Factory Method Vs Abstract Factory by Example
工厂模式(factory pattern)的更多相关文章
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- 工厂模式(factory pattern) ------创造型模式
创建型模式 简单工厂模式的缺点是: 当我们引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,需要修改工厂类的方法,违反了“开闭原则”. 工厂模式提供了一个抽象工厂接口来声明抽象工厂方 ...
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- 【设计模式】工厂模式 Factory Pattern
1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...
- JAVA设计模式之工厂模式—Factory Pattern
1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...
- 设计模式 - 出厂模式(factory pattern) 详细说明
出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...
- 设计模式(一)工厂模式Factory(创建型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
随机推荐
- MathJax的基本使用
MathJax是一个开放源代码的JavaScript显示引擎,适用于所有现代浏览器中的LaTeX.MathML和AsciMath表示法. MathJax官网为 https://www.mathjax. ...
- git获取特定的commit
git reset --hard [commit_id]
- JS 的事件基础、事件侦听与抛发、
前言 JavaScript是一种事件驱动型语言.事件驱动是指JavaScript引擎并不是在看到代码之后就会立即执行,而是会在合适的时间才去执行.这个合适的时间是指当某个事件发生之后(例如一个输入框的 ...
- .Net Core MVC 基于Cookie进行用户认证
在打代码之前先说一下思路. 登录的的时候服务端生成加密的字符串(用户名.id.当前时间)并且存入客户端cookie中,服务端的缓存中.对客户端的每次请求进行拦截,解密保存在cookie中的加密字符串. ...
- stand up meeting 12/28/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 解决生词本显示[阅读页面]的滑动条和PDF的滑动条冲突 ...
- Python之疑难杂症包安装
ansible 直接用pip install 安装一直失败 1.下载ansible压缩包 https://files.pythonhosted.org/packages/ec/ee/1494474b5 ...
- python基础--str.split
string = 'This +is -a /string' process = string.split('-') process1 = string.split('-')[-1]#-1和-2可能存 ...
- 将函数作为返回值的方法 - Python
有的时候,我们需要将函数作为返回值,以下为代码: def superfunc(): i = 0 def wrapper(): nonlocal i i +=1 return i return wrap ...
- [YII2] 3步发送邮件,有图有真相!
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABOQAAAIcCAYAAABW0HFSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw ...
- Java中BigDecimal类
由于在运算的时候,float类型和double很容易丢失精度,演示案例,所以,为了能精确地表示.计算浮点数,Java提供了BIgDecimal BigDecimal类的概述 不可变的.任意精度的有符号 ...