一、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
#include <iostream>
using namespace std;
//定义抽象类
class product
{
public:
virtual void show() = 0;
};
//定义具体类
class product_A :public product
{
public:
void show(){ cout << "product A" << endl; }
};
class product_B:public product
{
public:
void show(){ cout << "product B" << endl; }
};
//只有一个工厂,可以生产两种产品,逻辑在内部判断
class Factory
{
public:
product *creat(int i)
{
switch (i)
{
case 1:
return new product_A();
break;
case 2:
return new product_B();
break;
default:
break;
}
}
};
int main()
{
Factory *factory = new Factory();
factory->creat(1)->show();
factory->creat(2)->show();
}
二、工厂方法模式
有上面所知,简单工厂主要缺点就是当新增加产品时候就要去修改工厂的类,这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
现在有A、B两种产品,那么就开两个工厂,工厂A负责生产A厂品,工厂B负责生产B种产品,这时候客户不需要告诉工厂生产那种厂品了,只需要告诉工厂生产就可以了。
具体实现如下:
#include <iostream>
using namespace std;
//定义抽象类
class product
{
public:
virtual void show() = 0;
};
//定义具体类
class product_A :public product
{
public:
void show(){ cout << "product A" << endl; }
};
class product_B :public product
{
public:
void show(){ cout << "product B" << endl; }
};
class Factory
{
public:
virtual product *creat() = 0;
};
class Factory_A :public Factory
{
public:
product* creat(){ return new product_A; }
};
class Factory_B :public Factory
{
public:
product* creat(){ return new product_B; }
};
int main()
{
Factory_A *factory1 = new Factory_A();
factory1->creat()->show();
Factory_B *factory2 = new Factory_B();
factory2->creat()->show();
return 0;
}
来张简单工厂模式和工厂方法模式的对比图
|
简单工厂模式 |
工厂方法模式 |
类型 |
创建型模式 |
创建型模式 |
概念 |
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 |
定义了一个用于创建对象的接口,让子类决定实例化哪一个类, 工厂方法使一个类的实例化延迟到其子类 |
特点 |
无需了解这些对象是如何创建如何组织的 |
粒度很小的设计模式,是简单工厂模式的衍生 一个抽象工厂对应一个抽象产品 |
优点 |
1. 含有必要的逻辑判断 ,随时可以创建产品类的实例 2. 客户端可以避免直接创建产品对象的责任 3. 耦合性低,明确区分了各自的职责 4. 有利于软件体系结构的优化 |
1. 克服了简单工厂模式的缺点 2. 具体工厂类只完成单一的任务 3. 代码简洁 4. 完全满足OCP,有很好的扩展性 |
缺点 |
1. 当产品有复杂的多层次等级结构时,工厂类只有自己,以不变应万变 2. 工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都收到影响 3. 系统扩展困难 4. 违背了开放—封闭原则 |
1. 不易于维护 2. 当同时需要修改多个产品类时,修改麻烦 |
适用范围 |
1. 创建的对象比较少 2. 客户只知道传入了工厂类的方法 |
1. 当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时 2. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时 |
共同点 |
本质都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。 |
三、抽象工厂模式
为什么要有抽象工厂模式呢,假如我们A产品中有A1和A2两种型号的厂品,B产品中有B1和B2两种型号的厂品,那怎么办,上面两种工厂模式就不能解决了。这个时候抽象工厂模式就登场了。还是开设两家工厂,工厂A负责生产A1 、A2型号产品,B工厂负责生产B1、B2型号的产品。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
具体实现如下:
#include <iostream>
using namespace std;
//定义抽象类
class product1
{
public:
virtual void show() = 0;
};
//定义具体类
class product_A1 :public product1
{
public:
void show(){ cout << "product A1" << endl; }
};
class product_B1 :public product1
{
public:
void show(){ cout << "product B1" << endl; }
};
//定义抽象类
class product2
{
public:
virtual void show() = 0;
};
//定义具体类
class product_A2 :public product2
{
public:
void show(){ cout << "product A2" << endl; }
};
class product_B2 :public product2
{
public:
void show(){ cout << "product B2" << endl; }
};
class Factory
{
public:
virtual product1 *creat1() = 0;
virtual product2 *creat2() = 0;
};
class FactoryA
{
public:
product1 *creat1(){ return new product_A1(); }
product2 *creat2(){ return new product_A2(); }
};
class FactoryB
{
public:
product1 *creat1(){ return new product_B1(); }
product2 *creat2(){ return new product_B2(); }
};
int main()
{
FactoryA *factoryA = new FactoryA();
factoryA->creat1()->show();
factoryA->creat2()->show();
FactoryB *factoryB = new FactoryB();
factoryB->creat1()->show();
factoryB->creat2()->show();
return 0;
}
关于这三种工厂模式的UML图之后再加上,还没不太会使用工具来画图。