跟着《重构》学设计模式——工厂方法与抽象工厂模式

1
2
3
4
5
6
public class YellowHumanFactory extends HumanFactory{
@Override
public Human createHuman() {
return new YellowHuman();
}
}

工厂方法模式

类型

对象创建型

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。该模式使一个类的实例化延迟到其子类。

UML

2024-03-20-12-40-28-20240320124027

2024-03-20-12-40-43-20240320124042

适用性

  1. 当一个类不知道它所必须创建的对象的类的时候;
  2. 当一个类希望由它的子类来指定它所创建的对象的时候;
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

结构

2024-03-20-12-43-17-20240320124316

代码实现

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
public interface Human {
public void laugh();
}

public class YellowHuman implements Human{

@Override
public void laugh() {
System.out.println("黄种人笑....");
}
}

public class HumanFactory {
Human createHuman() {
return null;
}
}

public class YellowHumanFactory extends HumanFactory{

@Override
public Human createHuman() {
return new YellowHuman();
}
}

静态工厂方法

也可以使用静态方法来创建简单工厂,但是使用静态方法的缺点是,不能通过继承来改变创建方法的行为。

抽象工厂模式

定义

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。

UML

2024-03-20-12-41-46-20240320124145

适用性

一个系统要独立于它的产品的创建、组合和表示时。

一个系统要由多个产品系列中的一个配置时。

当你要强调一系列相关的产品对象的设计以便进行联合适用时。

当你提供一个产品类库,而只想显示它们的接口而不是实现时。

优缺点

分离了具体的类,使得易于交换产品系列,有利于产品的一致性。难以支持新种类的产品。