1. 简单工厂模式
概念
- 让一个工厂类承担构建所有对象的职责
- 构建对象最常用的方式是 new 一个对象,这是一种硬编码。每 new 一个对象,相当于调用者多知道了一个类,增加了类与类之间的联系,不利于程序的松耦合
优点
- 封装构建过程,降低耦合,如果某个产品构造方法非常复杂,简单工厂模式还可以减少代码重复
- 在 GoF 所著的《设计模式》一书中,简单工厂模式被划分为工厂方法模式的一种特例
缺点
- 如果需要生产的产品过多,简单工厂模式化会导致工厂类过于庞大,承担过多的职责,变成超级类。当多个产品的生产过程需要修改时,都需要修改这个工厂,即这个简单工厂类不止一个引起修改的原因,违背了单一职责原则
- 当要生产新的产品时,必须在工厂类中添加新的分支,而开闭原则是类应该对修改封闭。我们希望在添加新功能时,只需增加新的类,而不是修改既有的类,违背了开闭原则
Demo
水果工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class FruitFactory {
public Fruit create(String type) {
switch (type) {
case "苹果":
AppleSeed appleSeed = new AppleSeed();
Sunlight sunlight = new Sunlight();
Water water = new Water();
return new Apple(appleSeed, sunlight, water);
case "梨子":
return new Pear();
default:
throw new IllegalArgumentException("暂时没有这种水果");
}
}
}调用者
1
2
3
4
5
6
7
8
9public class User {
private void eat() {
FruitFactory fruitFactory = new FruitFactory();
Fruit apple = fruitFactory.create("苹果");
Fruit pear = fruitFactory.create("梨子");
apple.eat();
pear.eat();
}
}
2. 工厂方法模式
概念
- 为了解决简单工厂模式的违背单一职责原则和违背开闭原则的缺点
- 工厂方法模式规定每个产品都有一个专属工厂
优点
- 当生产的产品过多时,工厂类不会变成超级类。工厂类会越来越多,保持灵活,不会越来越大、变得臃肿。如果某个产品的生产过程需要修改时,只需修改对应的工厂类即可,符合单一职责原则
- 当需要生产新的产品时,无需更改既有的工厂,只需要添加新的工厂即可。保持了面向对象的可扩展性,符合开闭原则
缺点
- 有几个产品就需要几个工厂类,耦合度没有明显下降
Demo
苹果工厂
1
2
3
4
5
6
7
8public class AppleFactory {
public Fruit create(){
AppleSeed appleSeed = new AppleSeed();
Sunlight sunlight = new Sunlight();
Water water = new Water();
return new Apple(appleSeed, sunlight, water);
}
}梨子工厂
1
2
3
4
5public class PearFactory {
public Fruit create(){
return new Pear();
}
}调用者
1
2
3
4
5
6
7
8
9
10public class User {
private void eat(){
AppleFactory appleFactory = new AppleFactory();
Fruit apple = appleFactory.create();
PearFactory pearFactory = new PearFactory();
Fruit pear = pearFactory.create();
apple.eat();
pear.eat();
}
}