4、设计模式之工厂模式

开始之前

本章节是一个系列,里面用的的代码实例都是连贯的。在实现某一种设计模式时,为了减少代码篇幅,前面博客出现model类(仅限公用的model类,比如compute、CPU、Mem、Disk等纯对象类)不会重复出现,读者在阅读某一篇博客时,如果发现突然出现了一个新的model类,在本片博客中没有其定义,可以往前面的博客翻一下!

最后,当本系列更新完成后,我会整个的代码完整贴出来,提供下载链接!

简单工厂模式

效果:用户不必关心对象怎么生产的,甚至不用关心这个具体对象是什么。
工厂的生产规则可以写入配置文件,这样修改时就不需要动代码了。

  • 缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则。
public class HUAWEICompute extends Compute{

    @Override
    protected String getName() {
        return "huawei compute";
    }
}
public class MacCompute extends Compute{

    @Override
    protected String getName() {
        return "mac compute";
    }
}
/**
 * 简单工厂模式
 * 有一个缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则
 */
public class SimpleFactory {

/**第一种实现方式
*/
    public static Compute createCompute(String type){
        switch (type){
            case "HUAWEI":
                return new HUAWEICompute();
            case "MAC":
                return new MacCompute();
            case "XIAOMI":
                return new XiaomiCompute();
            default:
                return null;
        }
    }
/**第二种实现方式
*/
    public static Compute createCompute(Class<? extends Compute> clzss){
        try {
            return clzss.newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

工厂方法模式

在简单工厂中,有一个缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则。
针对这个问题,所以引出了工厂方法模式。
在简单工厂模式中,不管生产什么品牌的鞋子,都用同一工厂。
而在工厂方法模式中,想要生产某一个品牌的鞋子,就使用其对应的工厂。
也就是说一个工厂只生产一种产品

  • 缺点:一个工厂只能生产一种产品,子类越来越多,系统中类的个数也会成倍增加。增加代码复杂度
public interface ComputeFactory {

    Compute createCompute();
}

public class HuaweiComputeFactory implements ComputeFactory{
    @Override
    public Compute createCompute() {
        return new HUAWEICompute();
    }
}

public class XiaomiComputeFactory implements ComputeFactory{
    @Override
    public Compute createCompute() {
        return new XiaomiCompute();
    }
}

抽象工厂模式

在工厂方法模式中,

  • 优点:增加分组非常简单,例如要增加Lenovo分组,只需创建Lenovo工厂和具体的产品实现类。
  • 缺点:分组中的产品扩展非常困难,要增加一个鼠标Mouse,既要创建抽象的Mouse接口, 又要增加具体的实现:DellMouse、HPMouse, 还要再每个Factory中定义创建鼠标的方法实现。
public class HUAWEIDisk extends Disk{
    @Override
    protected String getName() {
        return "huawei disk";
    }
}
public class HUAWEICpu extends CPU{

    @Override
    protected String getName() {
        return "huawei cpu";
    }
}
public class HUAWEIMem extends Mem{

    @Override
    protected String getName() {
        return "huawei mem";
    }
}
public interface Factory {

    Compute createCompute();

    CPU createCpu();

    Mem createMem();

    Disk createDisk();
}

public class HuaweiFactory implements Factory{
    @Override
    public Compute createCompute() {
        return new HUAWEICompute();
    }

    @Override
    public CPU createCpu() {
        return new HUAWEICpu();
    }

    @Override
    public Mem createMem() {
        return new HUAWEIMem();
    }

    @Override
    public Disk createDisk() {
        return new HUAWEIDisk();
    }
}

public class XiaomiFactory implements Factory{
    @Override
    public Compute createCompute() {
        return new XiaomiCompute();
    }

    @Override
    public CPU createCpu() {
        return new XiaomiCpu();
    }

    @Override
    public Mem createMem() {
        return new XiaomiMem();
    }

    @Override
    public Disk createDisk() {
        return new XiaomiDisk();
    }
}

总结

  • 简单工厂:唯一工厂类,一个产品抽象类,工厂类的创建方法依据入参判断并创建具体产品对象。
  • 工厂方法:多个工厂类,一个产品抽象类,利用多态创建不同的产品对象,避免了大量的if-else判断。
  • 抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品,减少了工厂子类的数量。
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
工厂模式是一种常见的创建型设计模式,用于创建对象,而不是通过直接调用构造函数来创建它们。工厂模式定义了一个接口,用于创建相关对象,但是让子类决定要实例化的类。在C++中,工厂模式可以通过以下步骤实现: 1. 创建一个抽象基类,该类定义了一个纯虚拟函数,该函数将返回一个指向基类的指针。这个基类就是我们的工厂接口。 ```c++ class Product { public: virtual ~Product() {} virtual void operation() = 0; }; ``` 2. 创建具体的产品类,它们继承自抽象基类,并实现了其纯虚拟函数。这些类就是我们的具体产品。 ```c++ class ConcreteProductA : public Product { public: void operation() override { /* 具体产品 A 的操作 */ } }; class ConcreteProductB : public Product { public: void operation() override { /* 具体产品 B 的操作 */ } }; ``` 3. 创建一个工厂类,该类实现了工厂接口,并根据需要创建具体的产品。这个工厂类就是我们的具体工厂。 ```c++ class Factory { public: virtual ~Factory() {} virtual std::unique_ptr<Product> createProduct() = 0; }; class ConcreteFactoryA : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductA>(); } }; class ConcreteFactoryB : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductB>(); } }; ``` 4. 在客户端代码中使用具体工厂创建具体产品。 ```c++ int main() { std::unique_ptr<Factory> factory = std::make_unique<ConcreteFactoryA>(); std::unique_ptr<Product> product = factory->createProduct(); product->operation(); return 0; } ``` 这就是工厂模式的基本实现方式。通过这种方式,我们可以将对象的创建过程与客户端代码分离,从而更好地实现模块化和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风吹千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值