Abstract Factory Pattern - 抽象工厂模式

2025-10-14 08:56:58

1、抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

2、当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

3、增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

1、增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

1、产品

protocol Button {

    func display()

}

class SpringButton : Button {

    func display() {

        print("SpringButton display")

    }

}

class SummerButton : Button {

    func display() {

        print("SummerButton display")

    }

}

protocol TextField {

    func display()

}

class SpringTextField : TextField {

    func display() {

        print("SpringTextField display")

    }

}

class SummerTextField : TextField {

    func display() {

        print("SummerTextField display")

    }

}

protocol ComboBox {

    func display()

}

class SpringComboBox : ComboBox {

    func display() {

        print("SpringComboBox display")

    }

}

class SummerComboBox : ComboBox {

    func display() {

        print("SummerComboBox display")

    }

}

2、工厂

protocol SkinFactory {

    func createButton() -> Button

    func createTextField() -> TextField

    func createComboBox() -> ComboBox

}

class SpringSkinFactory : SkinFactory {

    func createButton() -> Button {

        return SpringButton()

    }

    

    func createTextField() -> TextField {

        return SpringTextField()

    }

    

    func createComboBox() -> ComboBox {

        return SpringComboBox()

    }

}

class SummerSkinFactory : SkinFactory {

    func createButton() -> Button {

        return SummerButton()

    }

    

    func createTextField() -> TextField {

        return SummerTextField()

    }

    

    func createComboBox() -> ComboBox {

        return SummerComboBox()

    }

}

3、使用

let springFactory = SpringSkinFactory()

let springButton = springFactory.createButton()

springButton.display()

let springComboBox = springFactory.createComboBox()

let summerFactory = SummerSkinFactory()

let summerTextField = summerFactory.createTextField()

summerTextField.display()

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢