Swift設計模式:3.抽象工廠方法模式

weixin_34037977發表於2017-08-17

抽象工廠方法模式(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

相關文章