一、简单工厂模式

简单工厂模式,不属于GOF的23种经典设计模式,但是它的设计思想,可以作为初学者学习和思考。

简单工厂包含以下角色:

  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能;
  • 具体产品:实现或者继承抽象产品的子类;
  • 具体工厂:提供了创建具体产品的方法,调用者通过该方法获取产品对象。

二、实现

在src目录下,新建一个simplefactory文件夹,在该文件夹下新建一个simplefactory.cj文件和simplefactory.drawio文件

类图

核心代码

package DesignPattern.simplefactory

/*
* 咖啡抽象类
*/
abstract public class Coffee {
    Coffee(private var _name: String) {}

    prop name: String {
        get() {
            this._name
        }
    }

    public func addMilk(): Unit
}

/*
* 冰咖啡
*/
class IcedCoffee <: Coffee {
    init (name: String) {
        super(name)
    }
    public func addMilk() {
        println("您在给${this.name}加牛奶")
    }
}

/*
* 美式咖啡
*/
class AmericanCoffee <: Coffee {
    init (name: String) {
        super(name)
    }
    public func addMilk() {
        println("您在给${this.name}加牛奶")
    }
}

/*
* 咖啡工厂
*/
public class CoffeeFactory{
    /*
    * 必须是静态方法
    */
    public static func getCoffee(name: String): Option<Coffee> {
        if (name == "冰咖啡" || name == "IcedCoffee") {
            println("您的${name}, 请慢用! ")
            return IcedCoffee(name)
        } else if(name == "美式咖啡" || name == "AmericanCoffee") {
            println("您的${name}, 请慢用! ")
            return AmericanCoffee(name)
        } // 如果有其他咖啡,在增加
        else {
            return None
        } 
    }
}

测试代码

package DesignPattern
import DesignPattern.simplefactory.*

main(): Int64 {
    let coffee1: Coffee = CoffeeFactory.getCoffee("冰咖啡").getOrThrow()
    coffee1.addMilk()

    CoffeeFactory.getCoffee("美式咖啡").getOrThrow()
    return 0
}

三、优缺点

优点:

  • 封装性好:简单工厂模式封装了对象创建的细节,客户端不需要直接实例化具体的产品类。这有助于隐藏具体产品类的实现细节,使得客户端代码更加简洁和易于维护;
  • 解耦:简单工厂模式降低了客户端与具体产品类之间的耦合度。客户端只需要与工厂类交互,而不需要知道具体产品类的实现细节。这有助于减少代码的依赖性和提高系统的可维护性;
  • 代码复用:工厂类集中了产品对象的创建逻辑,可以在多个地方重用该工厂类来创建对象,提高了代码的复用性;
  • 扩展性好:当需要添加新的产品类时,只需要在工厂类中添加相应的创建逻辑,而无需修改客户端代码。这符合开闭原则,即对扩展开放,对修改封闭。

缺点:

  • 违反单一职责原则:简单工厂类通常负责创建多种类型的产品对象,这可能导致工厂类的职责过多,违反了单一职责原则。当产品类型较多时,工厂类的代码可能会变得庞大而难以维护;
  • 类型判断逻辑复杂:简单工厂模式通常需要根据客户端提供的参数或类型信息来判断需要创建哪种类型的产品对象。随着产品类型的增加,类型判断逻辑可能会变得复杂和易错;
  • 不易于扩展新的产品族:简单工厂模式是针对一个产品族设计的,如果需要添加新的产品族(即一组具有共同主题的产品),可能需要修改工厂类的代码,这违反了开闭原则。

四、适用环境

  • 工厂类负责创建的的产品较少的情况;
  • 客户端只知道传入工厂类的参数,不关心工厂如何创建的情况。

五、小结

本章为大家详细的介绍了仓颉设计模式中简单工厂模式的内容,下一章,为大家带来简单工厂模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐