工厂模式

工厂模式

1. 简介

  1. 作用

  1. 核心本质
  • 实例化对象不使用new,用工厂方法代替。
  • 将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。

2. 三种工厂模式

2.1 简单工厂模式

环境准备

  1. 一个汽车的接口
1
2
3
public interface Car {
void name();
}
  1. 汽车的产品(实现接口)
1
2
3
4
5
public class 五菱宏光 implements Car {
public void name() {
System.out.println("我是五菱宏光");
}
}
1
2
3
4
5
public class 宝马 implements Car {
public void name() {
System.out.println("我是宝马三系");
}
}
  1. 简单工厂模式(汽车工厂)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//简单工厂模式(静态工厂模式)
//弊端:不修改代码,无法做到新增一个产品(不满足开闭原则)
public class FactoryDemo01 {
//方法一:不满足开闭原则
public static Car getCar(String car){
if (car.equals("五菱宏光")){
return new 五菱宏光();
}else if (car.equals("宝马")){
return new 宝马();
}else {
return null;
}
}

//方法二:不满足开闭原则
public static Car getWuling(){
return new 五菱宏光();
}
public static Car getBaoMa(){
return new 宝马();
}
}
  1. 消费者
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Consumer {
public static void main(String[] args) {
//1.传统方式
五菱宏光 car1 = new 五菱宏光();
car1.name();

//2.使用工厂创建
Car car2 = FactoryDemo01.getCar("宝马");
Car car3 = FactoryDemo01.getCar("五菱宏光");
car2.name();
car3.name();
}
}

原理图如下:

2.2 工厂方法模式

环境准备

  1. 一个汽车的接口
1
2
3
public interface Car {
void name();
}
  1. 一个汽车接口的工厂接口
1
2
3
4
//工厂方法模式
public interface CarFactory {
Car getCar();
}
  1. 每种汽车的实现类和工厂实现类
1
2
3
4
5
public class 五菱宏光 implements Car {
public void name() {
System.out.println("我是五菱宏光");
}
}
1
2
3
4
5
public class 五菱宏光Factory implements CarFactory {
public Car getCar() {
return new 五菱宏光();
}
}

1
2
3
4
5
public class 宝马 implements Car {
public void name() {
System.out.println("我是宝马三系");
}
}
1
2
3
4
5
public class 宝马Factory implements CarFactory {
public Car getCar() {
return new 宝马();
}
}
  1. 消费者购买
1
2
3
4
5
6
7
8
9
public class Consumer {
public static void main(String[] args) {
Car car1 = new 五菱宏光Factory().getCar();
Car car2 = new 宝马Factory().getCar();

car1.name();
car2.name();

}
  1. 如果想新增一种业务
1
2
3
4
5
public class 摩拜 implements Car {
public void name() {
System.out.println("我是摩拜");
}
}
1
2
3
4
5
public class 摩拜Factory implements CarFactory {
public Car getCar() {
return new 摩拜();
}
}

那么不需要修改业务代码,只需要新增一个工厂

消费者的改变如下:只需要新增一个业务即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Consumer {
public static void main(String[] args) {
Car car1 = new 五菱宏光Factory().getCar();
Car car2 = new 宝马Factory().getCar();

car1.name();
car2.name();

//工厂方法模式(可以随时的扩展)
Car car3 = new 摩拜Factory().getCar();
car3.name();

}
}

原理图如下

3. 总结

  • 结构复杂度:简单工厂>工厂方法
  • 管理复杂度:简单工厂>工厂方法
  • 编程复杂度:简单工厂>工厂方法

实际上:简单工厂也是使用最多的

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信