将同一个接口的不同实现的实例化逻辑与实例的使用者隔离起来,降低使用者与生产过程的耦合。
工厂模式一般分为三种:
- 简单工厂模式
- 工厂方法模式
- 抽象工程模式
简单工厂模式
简单工程模式又叫做静态工厂模式, 工厂对象根据参数来决定生成不同的产品类实例,产品具有共同抽象类或者接口·
简单工厂模式包含三种角色:
- 工厂角色:负责生成产品类对象
- 产品类抽/接口:所有产品类的抽象,负责描述产品类的共同接口
- 产品类角色:创建目标
优缺点
优点:简单易用,能够做到调用者与产品对象实例化过程分离,降低耦合度。
缺点:不利于扩展,违反开闭原则,当新增加一个产品时要修改工厂类
所以如果产品类的实例化过程不复杂,在可预期的未来产品的数量不会频繁增加适合用简单工厂模式
实现
protocol Animal {
func eat()
func breath()
}
enum AnimalType {
case Cat
case Dog
}
class Cat: Animal {
func eat() {
print("I am a cat, i am eating")
}
func breath() {
print("I am a cat, i am breathing")
}
}
class Dog: Animal {
func eat() {
print("I am a cat, i am eating")
}
func breath() {
print("I am a cat, i am breathing")
}
}
class AnimalFactory {
class func createAnimal(type: AnimalType) -> Animal {
switch type {
case .Cat:
return Cat()
case .Dog:
return Dog()
}
}
}
AnimalFactory.createAnimal(type: .Dog).breath()
工厂方法
工厂方法是将每个产品的实例化过长抽取成单独的工厂类,工厂方法模式有四种角色
- 抽象工厂角色:定义产品工厂的接口描素
- 产品工厂角色:负责生成具体的产品类对象
- 抽象产品类角色:对产品类的抽象
- 具体产品类角色
优点:
调用者只需要调用对应产品类的工厂方法,不需要知道具体构造构造过程。
易扩展,如果需要添加一个新的产品类,只需要添加对应的产品工厂就可以了。
缺点:
代码变多了,一定程度上增加了代码的复杂度。
实现:
protocol IAnimalFactory {
static func create() -> Animal
}
class DogFactory: IAnimalFactory {
static func create() -> Animal {
return Dog()
}
}
class CatFactory: IAnimalFactory {
static func create() -> Animal {
return Cat()
}
}
CatFactory.create().breath()
抽象工厂
当产品出现多个分类的时候在用工厂方法模式,工厂类就会成倍数增长,这时候我们希望工厂类能创建多种产品实例,而不只是一种。
抽象工厂模式提供一个创建一系列相关或者相互依赖的对象接口,而无需指定他们具体的类
优点:
减少工厂类
当一个产品族里的多个对象被设计成一起工作时,它能够保证多个对象属于同一个产品族
缺点
想要增加一个产品时,无法通过修改某个具体工厂类增加,需要修改工厂抽象,并修改所有工厂类。
适用场景:
能够对产品类进行很好的分类,并且产品的个数不会随便变动
实现
protocol Keyboard {
func input()
}
protocol Display {
func display()
}
protocol IFactory {
static func createKeyboard() -> Keyboard
static func createDisplay() -> Display
}
class DellKeyboard: Keyboard {
func input() {
print("I am dell input")
}
}
class HuaWeiKeyboard: Keyboard {
func input() {
print("I am HuaWei input")
}
}
class DellDisplay: Display {
func display() {
print("I am dell input")
}
}
class HuaWeiDisplay: Display {
func display() {
print("I am HuaWei input")
}
}
class DellFactory: IFactory {
static func createKeyboard() -> Keyboard {
return DellKeyboard()
}
static func createDisplay() -> Display {
return DellDisplay()
}
}
class HuaWeiFactory: IFactory {
static func createKeyboard() -> Keyboard {
return HuaWeiKeyboard()
}
static func createDisplay() -> Display {
return HuaWeiDisplay()
}
}