Swift设计模式:3.抽象工厂方法模式

2017-08-17  本文已影响411人  爱抽烟的芭比

抽象工厂方法模式(Abstract Factory Pattern)

一.什么是抽象工厂方法模式:

为创建一组相关或互相依赖的对象提供一个接口,而且无需指定它们的具体类。

二.抽象工厂方法模式的优点:

1.封装性:每个产品的实现类不是高层模块要关心的。它不关心对象是如何创建出来的,这些是由工厂类负责的。
2.产品族类的约束为非公开的。

三.抽象工厂模式的使用场景:

1.编译器无法定义创建对象类
2.类可以让其子类决定在运行期具体实例化的对象
3.封装一组相互关联的类的创建

四.Swift实现抽象工厂方法模式:

产品类:


protocol HumanColor {
    func getColor()
}


protocol HumanSex {
    func getSex()
}

protocol Human : HumanSex,HumanColor {
    
}

//黑人
class BlackHuman : Human {
    func getColor() {
        print("Black")
    }
    func getSex(){
        
    }
}

//男性黑人
class BlackMan: BlackHuman {
    override func getSex() {
        print("BlackMan")
    }
}

//女性黑人
class BlackFeman: BlackHuman {
    override func getSex() {
        print("BlackFeman")
    }
}

class WhiteHuman : Human {
    func getColor() {
        print("White")
    }
    
    func getSex() {
        
    }
}

class WhiteMan: WhiteHuman {
    override func getSex() {
        print("WhiteMan")
    }
}

class WhiteFeman: WhiteHuman {
    override func getSex() {
        print("WhiteFeman")
    }
}

class YellowHuman : Human {
    func getColor() {
        print("Yellow")
    }
    func getSex() {
    
    }
}

class YellowMan: YellowHuman {
   override func getSex() {
        print("YellowMan")
    }
}

class YellowFeman: YellowHuman {
   override func getSex() {
        print("YellowFeman")
    }
}

不管是黑人,白人还是黄种人,它们都有男人和女人。那么,在造人的时候就要分别造出男人和女人。
工厂类:

enum HumanType {
    case man
    case feman
}

class HumanFactory {
    
    func CreateBlackHuman() -> Human?  {
        return nil
    }
    
    func CreateWhiteHuman()-> Human? {
        return nil
    }
    func CreateYellowHuman() -> Human? {
        return nil
    }
    
    static func makeHumanFactory(type:HumanType) -> HumanFactory {
        
        switch type {
        case .man:
            return ManFactory()
        case .feman:
            return FemanFactory()
        }
    }
}

fileprivate class ManFactory : HumanFactory
{
    override func CreateBlackHuman() -> Human? {
        return BlackMan()
    }
    
    override func CreateWhiteHuman()-> Human? {
        return WhiteMan()
    }
    override func CreateYellowHuman() -> Human? {
        return YellowMan()
    }
}

fileprivate class FemanFactory : HumanFactory
{
    override func CreateBlackHuman() -> Human? {
        return BlackFeman()
    }
    
    override func CreateWhiteHuman() -> Human? {
        return WhiteFeman()
    }
    override func CreateYellowHuman() -> Human? {
        return YellowFeman()
    }
    
}

创建两个工厂类,分别建造男人和女人。抽象工厂类只需要根据参数返回这两个工厂类即可。
调用:

let fac =  HumanFactory.makeHumanFactory(type: .man)
        var human = fac.CreateBlackHuman()
        human?.getColor()
        human?.getSex()
        
        human = fac.CreateWhiteHuman()
        human?.getSex()
        human?.getColor()
        
        human = fac.CreateYellowHuman()
        human?.getSex()
        human?.getColor()

demo地址:Abstract Factory Method Pattern

上一篇 下一篇

猜你喜欢

热点阅读