设计模式之简单工厂模式
2019-04-04 本文已影响0人
HotCatLx
1. 杂篇
- 代码地址 HotCatLX Github
- 其余设计模式指引
- 更多的实际应用会不断更新
- 语言 : swift
- 补充 : 代码风格,设计不合理,请随时告知.如果有好的具体案例,也请告诉我,如果觉得不错,手动star
2. 基本概念
- 也许简单工厂模式是开发中应用最多的设计模式,也是最基本的设计模式(甚至不是GoF总结出来的23种设计模式之一),但是你是否有总结过具体什么场景适用简单工厂模式呢?
- 工厂 : 在容易变化的地方,用一个单独的类来做创造实例的过程,这个就是工厂
- 使用场景
在有需要创建相同属性或者方法的对象的地方,为了增加扩展性,在客户端调用时不需要涉及到具体的对象创建过程,也不需要知道具体的对象类型,可以使用简单工厂模式
客户端调用只需要面向工厂,具体工厂内的创建对象过程不需要暴露给客户端,且由于抽象类的抽取,在需要更多的对象创建过程,只需要增加新的子类即可
3. 组成和类图
UML类图- 抽象类和子类
抽象类 : 因为需要简单工厂类的使用场景应该是存在相同属性或者方法的类的抽取,所以抽象类的抽取,使得简单工厂类直接面向抽象类,能够增加扩展性
子类 : 抽象类的具体实例化,具体方法的实现
- 简单工厂类
在客户端面向客户端,根据传参的不同,创建具体的子类对象
4. 具体案例
4.1 案例1 : 计算器
- 计算器功能,客户端输入两个数和一个运算符,获取运算结果
- 需求
- 客户端调用时代码尽量简洁,再修改运算符时,不需要修改过多代码,不需要知道具体有什么操作,只需要修改传参即可
-
存在增加不同的运算符的需求
UML类图
4.2 案例1代码
- 抽象类
class Operation {
var numberFirst : Double = 0.0 //操作数1
var numberSec : Double = 0.0 //操作数2
func getResult() -> Double { //获取结果
let result = 0.0
return result;
}
}
- 具体子类 : 子类字需要重写getResult方法,在getResult里实现对应的方法
/*
* 加法子类
*/
class OperationAdd: Operation {
override func getResult() -> Double {
var result = 0.0
result = numberFirst + numberSec
return result
}
}
/*
* 减法子类
*/
class OperationSub: Operation {
override func getResult() -> Double {
var result = 0.0
result = numberFirst - numberSec
return result
}
}
- 简单工厂
class OperationFactory {
//传输操作符字符串,根据字符串决定创建什么具体的运算操作子类
//如果有需求增加了新的运算操作,只需要增加switch判断.并增加一个新的操作运算子类即可,客户端调用不需要改动
func operationWithOperator(operatorStr : String) -> Operation {
var operation = Operation();
switch operatorStr {
case "+":
operation = OperationAdd()
case "-":
operation = OperationSub()
case "*":
operation = OperationMul()
case "/":
operation = OperationDiv()
default:
operation = Operation();
}
return operation;
}
}
- 客户端调用 : 增加运算符或者修改某一些运算规则.客户端调用的地方不需要修改,或者只需要修改调用传参的运算符
override func viewDidLoad() {
super.viewDidLoad()
let once = OperationFactory().operationWithOperator(operatorStr: "+")
once.numberFirst = 15
once.numberSec = 5
let result = once.getResult()
print("result is ",result)
}
5. 思考
- 简单工厂模式 或者 简单工厂模式的变种方案 在开发中比比皆是
- 简单工厂模式 & 多态 & 抽象类的结合在具体实践中能带来低耦合,高扩展的业务代码