基本介绍
- 简单工厂模式是属于创建型模式,但不属于 23 种 GOF 设计模式之一。简单工厂模式是
由一个工厂对象决定创建出哪一种产品类的实例
。简单工厂模式是工厂模式家族中最简单实用的模式 - 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.
需求
看一个披萨的项目:要便于披萨种类的扩展,要便于维护,完成披萨订购功能。
披萨抽象类的设计,如下:
传统解决方案
class OrderPizza {
var orderType: String = _
var pizza: Pizza = _
breakable {
do {
println("请输入pizza的类型")
orderType = StdIn.readLine()
if (orderType.equals("greek")) {
this.pizza = new GreekPizza
} else if (orderType.equals("pepper")) {
this.pizza = new PepperPizza
} else {
break()
}
this.pizza.prepare()
this.pizza.bake()
this.pizza.cut()
this.pizza.box()
} while (true)
}
}
传统的方式的优缺点
- 优点是比较好理解,简单易操作。
- 缺点是违反了设计模式的
ocp 原则
,即对扩展开放
,对修改关闭
。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码. - 比如我们这时要新增加一个 Pizza 的种类(Cheese 披萨),我们需要在多出做修改
简单工厂例子:
将生产对象
的逻辑抽象到一个类
中, 解耦
, 代码重用性高
:
object SimpleFactory {
//提供了一个创建Pizza的方法,有需要创建Pizza调用该方法即可
def createPizza(t: String): Pizza = {
var pizza: Pizza = null
if (t.equals("greek")) {
pizza = new GreekPizza
} else if (t.equals("pepper")) {
pizza = new PepperPizza
} else if (t.equals("cheese")) {
pizza = new CheesePizza
}
return pizza
}
}
外部调用示例:
class OrderPizza {
var orderType: String = _
var pizza: Pizza = _
breakable {
do {
println("请输入pizza的类型 使用简单工厂模式~~")
orderType = StdIn.readLine()
pizza = SimpleFactory.createPizza(orderType)
if (pizza == null) {
break()
}
this.pizza.prepare()
this.pizza.bake()
this.pizza.cut()
this.pizza.box()
} while (true)
}
}