一、抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。(创建型)
为了更好的理解抽象工厂,需要了解两个概念:
产品等级结构:产品继承结构,比如:手机是抽象类,华为手机、荣耀手机就是它的子类;
产品族:同一工厂生产的位于不同产品等级结构中的一组产品,比如:华为工厂生产华为手机、华为电脑,华为手机位于手机产品等级结构,华为电脑位于电脑产品等级结构中,华为手机和华为电脑构成一个产品族。
抽象工厂包含以下角色:
- 抽象工厂:用于创建一族产品的接口;
- 具体工厂:实现抽象工厂里创建一组产品的方法,生成一组具体的产品,每个产品都位于该产品等级结构;
- 抽象产品:每种产品接口;
- 具体产品:定义具体工厂的具体产品对象。
二、实现
在src目录下,新建一个abstractfactory文件夹,在该文件夹下新建一个abstractfactory.cj文件和abstractfactory.drawio文件。
类图
核心代码
package DesignPattern.abstractfactory // 抽象产品 public interface Phone { func getInfo():Unit } class HuaWeiPhone <: Phone { public override func getInfo() { println("华为手机") } } class RongYaoPhone <: Phone { public override func getInfo() { println("荣耀手机") } } // 抽象产品 public interface Computer { func getInfo(): Unit } class HuaWeiComputer <: Computer { public override func getInfo() { println("华为电脑") } } class RongYaoComputer <: Computer { public override func getInfo() { println("荣耀电脑") } } // 抽象工厂 public interface Factory { func createPhone(): Phone func createComputer(): Computer } public class HuaWeiFactory <: Factory { // 生产华为手机 public override func createPhone(): Phone { return HuaWeiPhone() } // 生产华为电脑 public override func createComputer(): Computer { return HuaWeiComputer() } } public class RongYaoFactory <: Factory { // 生产荣耀手机 public override func createPhone(): Phone { return RongYaoPhone() } // 生产荣耀电脑 public override func createComputer(): Computer { return RongYaoComputer() } }测试代码
package DesignPattern import DesignPattern.abstractfactory.* main(): Int64 { HuaWeiFactory().createPhone().getInfo() HuaWeiFactory().createComputer().getInfo() RongYaoFactory().createPhone().getInfo() RongYaoFactory().createComputer().getInfo() return 0 }三、优缺点
优点:
- 抽象工厂隔离了具体类的生成,想要更换不同的产品,只需要更换该产品的工厂即可;
- 当一个产品族的多个对象被设计成一起工作时,可以保证客户端始终只使用同一个产品族中的对象。
缺点:
- 添加新的产品等级结构麻烦,需要改动原有的代码,违背了开闭原则。
四、适用环境
- 系统中有多个产品族,而每次都只使用一个产品族;
- 产品等级结构稳定,在系统设计完成后,不会向系统中增加新的产品等级结构或者删除原有的等级结构。
五、小结
本章为大家详细的介绍了仓颉设计模式中抽象工厂模式的内容,下一章,为大家带来抽象工厂模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!