工厂模式

将同一个接口的不同实现的实例化逻辑与实例的使用者隔离起来,降低使用者与生产过程的耦合。

工厂模式一般分为三种:
  1. 简单工厂模式
  2. 工厂方法模式
  3. 抽象工程模式
简单工厂模式

简单工程模式又叫做静态工厂模式, 工厂对象根据参数来决定生成不同的产品类实例,产品具有共同抽象类或者接口·

简单工厂模式包含三种角色:

  1. 工厂角色:负责生成产品类对象
  2. 产品类抽/接口:所有产品类的抽象,负责描述产品类的共同接口
  3. 产品类角色:创建目标

优缺点
优点:简单易用,能够做到调用者与产品对象实例化过程分离,降低耦合度。
缺点:不利于扩展,违反开闭原则,当新增加一个产品时要修改工厂类

所以如果产品类的实例化过程不复杂,在可预期的未来产品的数量不会频繁增加适合用简单工厂模式

实现

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()
工厂方法

工厂方法是将每个产品的实例化过长抽取成单独的工厂类,工厂方法模式有四种角色

  1. 抽象工厂角色:定义产品工厂的接口描素
  2. 产品工厂角色:负责生成具体的产品类对象
  3. 抽象产品类角色:对产品类的抽象
  4. 具体产品类角色

优点:
调用者只需要调用对应产品类的工厂方法,不需要知道具体构造构造过程。
易扩展,如果需要添加一个新的产品类,只需要添加对应的产品工厂就可以了。
缺点:
代码变多了,一定程度上增加了代码的复杂度。

实现:

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()
    }
}

你可能感兴趣的:(工厂模式)