程序设计模式(三):抽象工厂模式

简介:

参考:https://www.jianshu.com/p/7deb64f902db

抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。

适用场景:

当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。

系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。

系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

优缺点:

优点:
降低耦合:抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
更符合开-闭原则:新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可
符合单一职责原则:每个具体工厂类只负责创建对应的产品
不使用静态工厂方法,可以形成基于继承的等级结构。

缺点:
抽象工厂模式很难支持新种类产品的变化。
这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

类图:

img

实现:

步骤1: 创建抽象工厂类,定义具体工厂的公共接口

1
2
3
4
abstract class Factory{
public abstract Product ManufactureContainer();
public abstract Product ManufactureMould();
}

步骤2: 创建抽象产品族类 ,定义具体产品的公共接口;

1
2
3
abstract class AbstractProduct{
public abstract void Show();
}

步骤3: 创建抽象产品类 ,定义具体产品的公共接口;

1
2
3
4
5
6
7
8
9
10
11
//容器产品抽象类
abstract class ContainerProduct extends AbstractProduct{
@Override
public abstract void Show();
}

//模具产品抽象类
abstract class MouldProduct extends AbstractProduct{
@Override
public abstract void Show();
}

步骤4: 创建具体产品类(继承抽象产品类), 定义生产的具体产品;

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
//容器产品A类
class ContainerProductA extends ContainerProduct{
@Override
public void Show() {
System.out.println("生产出了容器产品A");
}
}

//容器产品B类
class ContainerProductB extends ContainerProduct{
@Override
public void Show() {
System.out.println("生产出了容器产品B");
}
}

//模具产品A类
class MouldProductA extends MouldProduct{

@Override
public void Show() {
System.out.println("生产出了模具产品A");
}
}

//模具产品B类
class MouldProductB extends MouldProduct{

@Override
public void Show() {
System.out.println("生产出了模具产品B");
}
}

步骤5:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;

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
//A厂 - 生产模具+容器产品
class FactoryA extends Factory{

@Override
public Product ManufactureContainer() {
return new ContainerProductA();
}

@Override
public Product ManufactureMould() {
return new MouldProductA();
}
}

//B厂 - 生产模具+容器产品
class FactoryB extends Factory{

@Override
public Product ManufactureContainer() {
return new ContainerProductB();
}

@Override
public Product ManufactureMould() {
return new MouldProductB();
}
}

步骤6:客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//生产工作流程
public class AbstractFactoryPattern {
public static void main(String[] args){
FactoryA mFactoryA = new FactoryA();
FactoryB mFactoryB = new FactoryB();
//A厂当地客户需要容器产品A
mFactoryA.ManufactureContainer().Show();
//A厂当地客户需要模具产品A
mFactoryA.ManufactureMould().Show();

//B厂当地客户需要容器产品B
mFactoryB.ManufactureContainer().Show();
//B厂当地客户需要模具产品B
mFactoryB.ManufactureMould().Show();

}
}