设计模式系列之五工厂模式

Java实现

简单工厂

  简单工厂应该是最简单的工厂方法了,也是最常见的。下面,通过代码就知道为什么这么说了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SimplePizzaFactory {

public Pizza createPizza(String type) {
Pizza pizza = null;

if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("pepperoni")) {
pizza = new PepperoniPizza();
} else if (type.equals("clam")) {
pizza = new ClamPizza();
} else if (type.equals("veggie")) {
pizza = new VeggiePizza();
}
return pizza;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class PizzaStore {
SimplePizzaFactory factory;

public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}

public Pizza orderPizza(String type) {
Pizza pizza;
//通过简单工厂创建不同类型的披萨
pizza = factory.createPizza(type);

pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();

return pizza;
}
}

  通过简单工厂方法,有效的把new Object()解耦了出来。在实际的业务中,不用再去关心如何去创建对象。特别是对象的创建与初始化很复杂,且有很多地方都需要用到该对象时,就不用每个地方都去显示的new一下,要修改初始化条件时,也只需要修改工厂方法即可。

工厂方法

定义:

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class PizzaStore {

//具体如何创建披萨交由子类去实现(注意对比这里跟简单工厂的区别)
abstract Pizza createPizza(String item);

public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
System.out.println("--- Making a " + pizza.getName() + " ---");
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//纽约风格的披萨
public class NYPizzaStore extends PizzaStore {

Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (item.equals("veggie")) {
return new NYStyleVeggiePizza();
} else if (item.equals("clam")) {
return new NYStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new NYStylePepperoniPizza();
} else return null;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//芝加哥风格的披萨
public class ChicagoPizzaStore extends PizzaStore {

Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new ChicagoStyleCheesePizza();
} else if (item.equals("veggie")) {
return new ChicagoStyleVeggiePizza();
} else if (item.equals("clam")) {
return new ChicagoStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new ChicagoStylePepperoniPizza();
} else return null;
}
}

抽象工厂

  在所有的工厂模式中,还有一种叫抽象工厂模式。不过一直无法理解抽象工厂模式的具体使用场景,所以这部分留着今后对抽象工厂模式理解深刻了再来总结吧。

Javascript实现

简单工厂

  举一个如下的业务场景:需要开发一个表单生成器,需要做到表单元素的自动生成。那么,可以采用简单工厂来创建表单元素对象。

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
35
36
37
38
39
40
41
(function () {
function SampleFormFactory() {

}
SampleFormFactory.fn = SampleFormFactory.prototype;
SampleFormFactory.fn.getFormElement = function (type) {
switch (type){
case "Input":
return new Input();
case "Select":
return new Select();
case "Textarea":
return new Textarea();
case "Radio":
return new Radio();
case "Checkbox":
return new Checkbox();
}
};

/*****************标准表单对象*****************/
function Input() {

}
function Select() {

}
function Textarea() {

}
function Radio() {

}
function Checkbox() {

}

//使用简单工厂创建表单元素
var factory = new SampleFormFactory();
var element = factory.getFormElement("Input");
})();

  至于在javascript中工厂方法模式的使用,一时想不到使用场景,感觉有点为了用设计模式而设计模式,所以这里就不再举例了。

上一篇:设计模式系列之四装饰者模式
下一篇:设计模式系列之六命令模式

留言

欢迎交流想法。留言会通过 GitHub Issues 保存,首次使用需要登录 GitHub。