Johuer's Blog

多学知识,精简代码

0%

图解设计模式(Creational)-FactoryMethod 3/23

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

参与角色

抽象产品角色(Product):定义产品的接口
具体产品角色(ConcreteProduct) :实现接口Product的具体产品类
抽象工厂角色(Creator) :声明工厂方法(FactoryMethod),返回一个产品
真实的工厂(ConcreteCreator):实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例

  • TextBuilder: 使用纯文本编写文档
  • HTMLBuilder: 使用HTML编写文档

UML

logo

示例代码

Prdocut

1
2
3
public abstract class Product {
public abstract void use();
}

Factory

1
2
3
4
5
public abstract class Factory {

public abstract Product createProduct(String owner);

}

ConcreteProduct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class IDCard extends Product {

private String owner;

public IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡");
this.owner = owner;
}

@Override
public void use() {
System.out.println("使用" + owner + "的ID卡");
}

}

ConcreteCreator

1
2
3
4
5
6
7
8
public class IDCardFactory extends Factory {

@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}

}

Main

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product p1 = factory.createProduct("张三");
Product p2 = factory.createProduct("李四");
Product p3 = factory.createProduct("王五");

p1.use();
p2.use();
p3.use();
}
}

Output

1
2
3
4
5
6
制作张三的ID卡
制作李四的ID卡
制作王五的ID卡
使用张三的ID卡
使用李四的ID卡
使用王五的ID卡

工厂方法模式看起来要比起简单工厂要麻烦不少,一个产品类就要对应一个工厂类,要增加产品类时也要相应地增加工厂类,客户端的代码也增加了不少,这也是很多初学者不明白的地方。的确,简单工厂是要简便些,所以它不适合应用在比较大的项目里,而且大部分情况下也是简单工厂要常用些。但是,你得先事先考虑好简单工厂是否无法承受你的项目,如果不能承受,就应该考虑使用工厂方法模式。

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。