这是我尝试写的第一篇文章,以软件开发的规划形式开端,记录一下自己的了解与心得,方便以后回过头来查看。以简略工厂开端:

什么是简略工厂?

简略工厂形式(Simple Factory Pattern)是一种创立型规划形式,它供给了一种简略的办法来创立目标,而不需求直接露出目标的创立逻辑给客户端。

UML 类图

以计算器为比如,拥有加减乘除功能,画出类图:

classDiagram
class 简略工厂类{
+createOperate() 创立运算类
}
简略工厂类-->运算接口 
运算接口 <|.. 加法类
运算接口 <|.. 减法类
运算接口 <|.. 乘法类
运算接口 <|.. 除法类
class 运算接口{
<<interface>>
var numberA
var numberB
-Double calculate()
}
class 加法类{
-Double calculate()
}
class 减法类{
-Double calculate()
}
class 乘法类{
-Double calculate()
}
class 除法类{
-Double calculate()
}

具体示例

// 运算符接口
protocol Operation {
  var numberA: Double { set get }
  var numberB: Double { setget }
  func calculate() -> Double
}
// 加法运算类
struct OperationAdd: Operation {
  var numberA: Double = 0.0
  var numberB: Double = 0.0
  func calculate() -> Double {
    return numberA + numberB
  }
}
// 减法运算类
struct OperationSub: Operation {
  var numberA: Double = 0.0
  var numberB: Double = 0.0
  func calculate() -> Double {
    return numberA - numberB
  }
}
// 乘法运算类
struct OperationMul: Operation {
  var numberA: Double = 0.0
  var numberB: Double = 0.0
  func calculate() -> Double {
    return numberA * numberB
  }
}
// 除法运算类
struct OperationDiv: Operation {
  var numberA: Double = 0.0
  var numberB: Double = 0.0
  func calculate() -> Double {
    if numberB != 0 {
      return numberA / numberB
    }
    return 0
  }
}
// 简略工厂类
class OperationFactory {
  static func createOperate(_ operate: String) -> Operation? {
    switch operate {
    case "+":
      return OperationAdd()
    case "-":
      return OperationSub()
    case** "*":
      return OperationMul()
    case "/":
      return OperationDiv()
    default: return nil
    }
  }
}
// 客户端调用
// 加法运算
var addOperation = OperationFactory.createOperate("+")
addOperation?.numberA = 1
addOperation?.numberB = 2
addOperation?.calculate()
// 减法运算
var subOperation = OperationFactory.createOperate("-")
subOperation?.numberA = 1
subOperation?.numberB = 2
subOperation?.calculate()
// 乘法运算
var mulOperation = OperationFactory.createOperate("*")
mulOperation?.numberA = 1
mulOperation?.numberB = 2
mulOperation?.calculate()
// 除法运算
var divOperation = OperationFactory.createOperate("/")
divOperation?.numberA = 1
divOperation?.numberB = 2
divOperation?.calculate()

简略工厂办法总结

长处:

  • 将目标的创立逻辑集中在工厂类中,降低了客户端的复杂度
  • 隐藏了创立目标的细节,客户端只需求关怀需求创立何种目标,无需关怀目标是怎么创立的。
  • 能够通过修改工厂类来轻松增加新的产品

缺陷:

  • 如果产品的类太多,会导致工厂类中的代码变得很复杂,难以保护。
  • 增加新产品时,需求修改工厂类,也便是会在OperationFactory类中新增case语句,这违反了开闭原则

总体而言,简略工厂形式适用于创立目标的逻辑相对简略,且产品类的数量较少的场景。关于更复杂的目标创立和目标之间的依靠关系,能够考虑运用其他创立型规划形式,如工厂办法形式或笼统工厂形式。

工厂办法