一句话总结
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到子类。
需求
热心大学生和社区志愿者都可以去帮助周边孤寡老人,那么如何实现创建这些热心对象呢?
简单工厂模式实现
static func main() {
let undergraduate = SimpleFctory.creatLeiFeng(type: "热心大学生")
undergraduate.sendFruit()
undergraduate.cleaningYard()
}
class LeiFeng {
func sendFruit() {
print("送水果")
}
func cleaningYard() {
print("打扫院子")
}
}
class Undergraduate: LeiFeng { }
class Volunteer: LeiFeng { }
class SimpleFctory {
static func creatLeiFeng(type: String) -> LeiFeng {
var leiFeng: LeiFeng = Undergraduate()
switch type {
case "热心大学生":
leiFeng = Undergraduate()
case "社区志愿者":
leiFeng = Volunteer()
default:
break
}
return leiFeng
}
}
工厂方法模式实现
static func main() {
let volunteer = VolunteerFctory.creatLeiFeng()
volunteer.sendFruit()
volunteer.cleaningYard()
}
class LeiFeng {
func sendFruit() {
print("送水果")
}
func cleaningYard() {
print("打扫院子")
}
}
class Undergraduate: LeiFeng { }
class Volunteer: LeiFeng { }
protocol LeiFengFctory {
static func creatLeiFeng() -> LeiFeng
}
class UndergraduateFctory: LeiFengFctory {
static func creatLeiFeng() -> LeiFeng {
return Undergraduate()
}
}
class VolunteerFctory: LeiFengFctory {
static func creatLeiFeng() -> LeiFeng {
return Volunteer()
}
}
简单工厂模式优点
工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对客户端来说,去除了对具体产品的依赖。
工厂方法模式优点
简单工厂模式在对产品进行扩展时,需要改工厂类的switch和客户端选择条件,违背了开放-封闭原则。工厂方法模式可以规避这一缺陷,由客户端选择用哪个工厂类来生成产品。
简单工厂与工厂方法区别
- 简单工厂是工厂类内部判断实例化哪一个产品类。
- 工厂方法是客户端选择使用哪个工厂类。
- 都会有选择判断的逻辑。