工厂模式Factory Pattern

参考:https://www.runoob.com/design-pattern/abstract-factory-pattern.html
https://www.cnblogs.com/yssjun/p/11102162.html
工厂模式属于创建型模式,顾名思义用来创建类对象的模式。目前,工厂模式可总结为以下三种:

一、简单工厂模式

简单工厂虽然比较简单,但是这个工厂不简单,客户要求(传参)生产什么,工厂就生产什么。根据不同参数返回不同类的实例。
类图如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403211200340.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NzkzMTY=,size_16,color_FFFFFF,t_70#pic_center

示例代码:

public class Demo {
    public static void main(String[] arg) {
        Factory factory = new Factory();
        Phone phone = factory.make("phone");            //生产一个手机
        Computer computer= factory.make("computer");    // 生产一个电脑
    }
}

大部分案例中,简单工厂模式的工厂只是生产某一类产品,只是根据参数不同,产品的部分属性不同。如传参为“小米”和“华为”,则分别生产小米手机和华为手机。本文的例子不知道恰不恰当,请大家参考。

简单工厂的缺点

  1. 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都受到影响;
  2. 静态工厂,工厂无法形成基于继承的等级结构;
  3. 扩展困难,增加新产品必须修改工厂逻辑,违反“开闭原则”。产品类型较多时,工厂逻辑复杂,不利于维护。
    所以简单工厂适用于简单的应用场景:需要创建的对象较少的情况。

简单工厂解决的主要矛盾是,客户端对产品生产细节的不了解。客户只需要知道产品名字(对应的参数),就可以通过简单工厂创建出对应产品。

二、工厂模式

与简单工厂模式相比工厂模式中的工厂比较“专业”。首先有一个工厂的抽象基类,不负责实际生产,只提供抽象接口,具体生产任务由各工厂子类执行。类图如下:
在这里插入图片描述

示例代码:

public class Demo {
    public static void main(String[] arg) {
        AbstractFactory phoneFactory = new PhoneFactory();
        AbstractFactory computerFactory = new ComputerFactory();
        phoneFactory.make();            // 生产一个手机
        computerFactory.make();        // 生产一个电脑
    }
}

优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

三、抽象工厂模式

以上一个工厂只能生产一种产品,如果工厂需要生产多种产品,抽象工厂就要出马了。它解决接口的选择问题。其类图如下:
在这里插入图片描述

示例代码:

public class Demo {
    public static void main(String[] arg) {
        AbstractFactory hwFactory = new HuaweiFactory();
        AbstractFactory smFactory = new SamungFactory();
        hwFactory.makePhone();            // 生产华为手机
        hwFactory.makePC();               // 生产华为PC
        smFactory.makePhone();            // 生产sm手机
        smFactory.makePC();               // 生产smPC
    }
}

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

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值