专门定义一个类来负责创建其他类的实例,被创建的实例常常具有共同的父类
定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体操作。工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传给外界,而对象的创建是由外界决定的,外界只需要知道抽象子类对应的参数即可,而不需要知道抽象子类的创建过程,在外界使用时甚至不用引入抽象子类
简单工厂模式类图
需求:实现俩个数的加、减运算
//创建一个抽象类,抽象类中包含了参与运算的抽象子类的属性和方法
class Operation {
private var _numA = 0
private var _numB = 0
var numA: Int{
get{
return _numA
}
set{
_numA = newValue
}
}
var numB: Int {
get{
return _numB
}
set{
_numB = newValue
}
}
func getResult() -> Int {
return 0
}
}
//创建负责运算的抽象子类
class OperationAdd:Operation {
override func getResult() -> Int {
return self.numA + self.numB
}
}
//创建负责运算的抽象子类
class OperationSub:Operation {
override func getResult() -> Int {
return self.numA - self.numB
}
}
//创建工厂类,根据参入参数,创建对应的抽象子类实例并返回给外界
class OperationFactory{
static func createOperation(operatr:String) -> Operation{
var oper:Operation?
switch operatr {
case "+":
oper = OperationAdd.init()
break
case "-":
oper = OperationSub.init()
break
default:
oper = Operation.init()
}
return oper!
}
}
//每次计算不同的算法直接改变参数里的符号(+、-)
var oper = OperationFactory.createOperation(operatr: "-")
oper.numA = 8
oper.numB = 5
let res = oper.getResult()
print(res)
简单工厂模式会有一个问题,就是如果新增加其他运算功能,需要创建一个抽象子类,但是还需要修改工厂类中的代码逻辑,这种设计是不符合开放封闭原则的。开放封闭原则对于修改是关闭的,对于扩展是开放的。而且将所有的操作子类的判断和实例化都由一个工厂类完成,如果业务比较复杂会导致工厂类负担较重