前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式 01】简单工厂

【设计模式 01】简单工厂

作者头像
JuneBao
发布2022-10-26 14:51:48
1280
发布2022-10-26 14:51:48
举报
文章被收录于专栏:JuneBao

通过传给工厂类的参数的不同,返回不同的对象

简单工厂模式

2020 / 4 / 30 参考:

简单工厂通过传给工厂类的参数的不同,返回不同的对象,包括三部分组成:

  1. 具体的”产品“
  2. 工厂类(实例化并返回”产品“)
  3. 客户端(使用”产品“)

为什么使用简单工厂:

  1. ”产品“的创建过程可能很复杂,涉及到多个不同类之间的依赖,通过简单工厂将创建过程隐藏在工厂类中,一方面减轻了客户端使用该产品的难度,另一方面也防止了客户端错误创建产品造成的安全问题。
  2. 将产品的生产和消费过程分离开,这样如果要有了一个新的产品,只需要把它加入到工厂类中,客户端需要时工厂类就会返回给它,否则的话,每次添加一个新的产品,都需要修改客户端代码,违反开闭原则。

简单工厂的缺点:

  1. 系统过度依赖工厂类,工厂类作为一个”上帝类“,负责创建客户端需要的所有对象,导致一旦工厂类出错,整个系统就会崩溃。
  2. 如果”产品类“特别多,工厂类中就会有很多个分支,造成工厂类异常庞大,难以维护。
  3. 每次添加新的产品都要修改工厂类,从工厂类的角度看违反了”开闭原则“,也不利于系统拓展。
  4. 工厂方法一般是静态方法,不利于继承。

适用场景

1、工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

2、客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

例:

如果需要获取不同的手机对象,就可以使用简单工厂,具体的手机对象依赖于CPU, Camera等,通过简单工厂的封装,客户端获取 Phone 对象时就不需要了解具体的 ”生产过程“了.

实例化CPU, Camera 等配件时,也应该使用简单工厂。

代码语言:javascript
复制
package pers.junebao.simple_factory;

import pers.junebao.simple_factory.fitting.*;
import pers.junebao.simple_factory.phone.Honor;
import pers.junebao.simple_factory.phone.OnePlus;
import pers.junebao.simple_factory.phone.Phone;

public class PhoneFactory {
    /**
     * 一个用来产生 Phone 对象的工厂方法
     * @param name 根据 name 产生不同的 Phone 的子类对象
     * @return 返回实例化后的对象,name 不匹配返回 null
     */
    public static Phone getPhone(String name) {
        if(name.toLowerCase().equals("oneplus")){
            // TODO:使用简单工厂重构
            CPU cpu = new Qualcomm();
            Camera camera = new Sony();
            return new OnePlus(cpu, camera);
        } else if (name.toLowerCase().equals("honor")) {
            CPU cpu = new Kirin();
            Camera camera = new Leica();
            return new Honor(cpu, camera);
        } else {
            return null;
        }
    }
}
代码语言:javascript
复制
package pers.junebao.simple_factory;

import pers.junebao.simple_factory.phone.Phone;

public class Consumer {
    public static void main(String[] args) {
        Phone phone = PhoneFactory.getPhone("Honor");
        assert phone != null;
        phone.printConfig();
    }
}

GitHub | 完整代码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-5-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单工厂模式
    • 为什么使用简单工厂:
      • 简单工厂的缺点:
        • 适用场景
          • 例:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档