工厂方法

设计模式—工厂方法

1.何为工厂方法

​ 定义一个用来创建对象的接口,让子类来决定实例化哪一个类。工厂方法将一个类的实例化延迟到子类。

2.工厂方法的意义和使用场景

​ 工厂方法隔离了类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的类型,紧耦合(new)会导致软件脆弱。它体现了单一责任原则和开闭原则。

​ 工厂模式解决“单个对象”的需求变化,缺点在于要求创建方法/参数相同。

3.工厂方法的实现

​ 工厂方法使用一个工厂基类来定义一个创建对象的接口,需要创建具体对象时,去实现具体的对象创建工厂来创建对象。这样,每当有新的类出现时,只需要去实现新的工厂就行了(开闭原则,对修改封闭,对拓展开放)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
		//分割器抽象类(稳定)
class ISplitter
{
public:
virtual void split() = 0;
virtual ~ISplitter(){}

};
//分割器工厂抽象类(稳定)
class SplitterFactory
{
public:
virtual ISplitter* create() = 0;
virtual ~SplitterFactory(){}

};
//文本分割器(变化)
class textSplitter :public ISplitter
{
virtual void split() {};
};
class textSplitterFactory :public SplitterFactory
{
virtual ISplitter* create() {};
};
//工厂生产对象的过程
class MainForm
{
SplitterFactory* myfactory;
MainForm(SplitterFactory* factory)
{
myfactory = factory;
}
void fun()
{
ISplitter* splitter = myfactory->create(); //实现了多态new,根据工厂的不同创建不同的splitter
splitter->split();
}
};

4.工厂方法的其他作用

​ 1.可以在创建对象的时候加入对参数的验证,当参数不满足条件时拒绝创建对象

​ 2.可以在工厂中创建一个vector,来跟踪记录已经创建好的对象。

5.抽象工厂

​ 抽象工厂是提供一个接口,把一系列相关的、相互依赖的对象的创建交给工厂来做,而无需指定具体的类。

​ 如一个数据库对象需要连接、命令、数据结果三个对象,使用一个工厂将相匹配的三个对象一起创建。这样即实现了解耦,又避免了用工厂方法一个一个创建对象可能造成的不匹配问题。(如创建了mysql连接,却又创建了redis命令来搭配使用),抽象工厂将这三个对象的创建封装在一起,保证了正确性。