0%

工厂模式

工厂模式

工厂模式可以将创建对象的具体过程屏蔽起来,其优点就是解耦

根据抽象程序的不同分为三种

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

简单工厂模式

简单工厂模式是提供一个创建对象实例的功能,而无需关心具体实现,工厂类根据传入的参数,动态决定创建哪一个产品类(这些产品类继承于同一个父类或接口),是用来选择实现的,可以选择任意接口的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private final TransactionManager transactionManager;

public SimpleTransactionFactory(TransactionManager transactionManager) {
Assert.notNull(transactionManager, "TransactionManager must not be null");
this.transactionManager = transactionManager;
}


@Override
public Transaction createTransaction(String name, int timeout) throws NotSupportedException, SystemException {
if (timeout >= 0) {
this.transactionManager.setTransactionTimeout(timeout);
}
this.transactionManager.begin();
return new ManagedTransactionAdapter(this.transactionManager);
}

优点

封装、解耦

用户只要产品,而不关心产品如何生产,工厂类根据传入的参数,动态决定创建哪一个产品类,如果新添加产品,不需要客户端去调整,只需要在调用工厂创建的方法的时候传入参数

缺点

增加客户端的复杂度、不方便扩展子工厂

由于是从客户端调用工厂的时候传入选择的参数,所以需要在工厂类中包含必要的逻辑判断,根据客户端的选择来动态实例化相关的类,每次添加新的产品,都需要在工厂中加入新的判断逻辑,而且客户端必须知道每个参数的含义,所以也就必须在一定程度上,向客户端暴露一定的内部实现细节

使用场景

  • 适用于产品对象少,且产品固定的需求

工厂方法模式

定义了一个创建对象的接口,使用工厂来处理创建对象的细节,使用继承的方式,由子类来负责决定具体类型,使一个类的实例化延迟到其子类,主要功能是让父类在不知道具体实现的情况下,完成自身的功能的调用,而具体的实现延迟到子类来实现

是用来选择实现的,但是与简单工厂的区别在于工厂方法将选择具体实现的功能延迟到子类去实现

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
// 产品
public interface IProduct {
void introduce();
}

// 具体的产品
public class Desk implements IProduct{
@Override
public void introduce() {
System.out.println("我是一张桌子呢");
}
}

// 工厂接口
public interface IFactory {
IProduct createProduct();
}

// 具体的产品工厂
public class DeskFactory implements IFactory{
@Override
public IProduct createProduct() {
return new Desk();
}
}

public class TestFactoryMethod {
public static void main(String[] args) {
IFactory factory = new DeskFactory();
IProduct product = factory.createProduct();
// 我是一张桌子呢
product.introduce();
}
}

通过代码可以知道,工厂方法模式有四个要素

  • 产品接口
  • 产品实现
  • 工厂接口/抽象类
  • 工厂实现

不同的产品由不同的工厂生产,但是增加了用户操作的复杂性,其与简单工厂模式相比,就是将在工厂中的逻辑判断转移到了客户端中,加功能修改客户端即可

优缺点

优点
  • 可以在不知具体实现的情况下编程
  • 使代码结构清晰
  • 对调用者屏蔽具体的产品类
  • 容易扩展,在增加产品类的情况下,只要适当的修改具体的工厂类或扩展一个工厂类
缺点
  • 如果有很多种类的产品,需要创建非常多的工厂

使用场景

  • jdbc连接数据库,不能的数据库使用不同的驱动
  • 如果一个类需要创建某个接口的对象,但是又不知道具体的实现
  • 如果一个类本身就希望由它的子类来创建所需要的对象

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,工厂方法和简单工厂关注的是单个产品对象的创建,而抽象工厂关注的是一系列的产品对象,而且这一系列对象又是构建新的对象所需要的组成部分

当有多个抽象角色时使用的一种工厂模式,与工厂方法模式类似,不过抽象工厂模式是通过对象的组合,提供一个用来创建一个产品的抽象类型,该类型的子类定义了产品被产生的方法,使用该工厂,需要先实例化,然后传入

是用来选择产品簇实现的,一般抽象工厂中会有多个用于选择并创建对象的方法

组成

  • 抽象工厂
  • 具体的工厂
  • 定义一类产品对象的接口
  • 具体的产品实现对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 抽象工厂,其内的各个产品是一个产品簇
public abstract class AbstractFactory{
public abstract AbstractProductA createProductA();

public abstract AbstractProductB createProductB();
}

// 抽象产品
public interface AbstractProductA{

}

public interface AbstractProductB{

}

优缺点

优点
  • 分离接口与实现
  • 切换产品簇比较容易
缺点
  • 不容易扩展新的产品
  • 结构不清晰,层次比较复杂

使用场景

  • 一个系统独立于它的产品的创建、组合和表示的时候,也就是一个系统只知道产品的接口,而不关心实现的时候
  • 一个系统要由多个产品系列中的一个来配置的时候,可以动态切换产品簇
  • 强调一系列相关产品的接口,可以联合使用它们

欢迎关注我的其它发布渠道