简单工厂模式

工厂模式专门将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪个类。工厂模式有以下几种形态:

  • 简单工厂模式(Simple Factory):又称静态工厂模式(Static Factory Method Pattern)

  • 工厂方法模式(Factory Method): 又称多态性工厂模式或虚拟构造子模式

  • 抽象工厂模式(Abstract Factory): 又称工具箱模式(Kit或ToolKit)

简单工厂模式

简单工厂模式,或称静态工厂方法模式,是不同的工厂方法的一个特殊实现。

简单工厂模式,或称静态工厂方法模式,是不同的工厂方法的一个特殊实现。比如有一个农场公司,专门向市场销售各类水果,我们会真么描述这个系统:

  • 定义一个各种水果都适用的接口
1
2
3
4
5
6
7
8
9
10
11
12
public interface Fruit {

//生长
void grow();

//收获
void harvest();

//种植
void plant();

}
  • 苹果类(多年生植物,多出一个treeAge性质)
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
public class Apple implements Fruit {

private int treeAge;

public int setTreeAge(int treeAge) {
this.treeAge = treeAge;
}

public int getTreeAge() {
return this.treeAge;
}

/*
* 生长
*/

public void grow() {
System.out.println("Apple is growing...");
}

/*
* 种植
*/

public void harvest() {
System.out.println("Apple is harvest.");
}

/*
* 收获
*/

public void plant() {
System.out.println("Apple has ben planted.");
}
}
  • 葡萄类,分有籽和无籽
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
public class Grape implements Fruit {

private boolean seedless;

public int setSeedless(boolean seedless) {
this.seedless = seedless;
}

public int getTreeAge() {
return this.seedless;
}

/*
* 生长
*/

public void grow() {
System.out.println("Grape is growing...");
}

/*
* 种植
*/

public void harvest() {
System.out.println("Grape is harvest.");
}

/*
* 收获
*/

public void plant() {
System.out.println("Grape has ben planted.");
}
}
  • 农场园丁类根据客户端的要求,创建不同的水果对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class FruitGardener {

/**
* 静态工厂方法
*/

public static Fruit factory(String which) {

switch(name) {
case "apple":
return new Apple();
break;
case "grape":
return new Grape();
break;
default:
return null;
break;
}
}
}
  • 客户端调用代码
1
2
FruitGardener.factory("apple");
FruitGardener.factory("grape");

总结:简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色3个角色

  • 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体java类实现。
  • 抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们有共同的接口。抽象产品角色可以由用一个java接口或java抽象类实现。
  • 具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。