Gof23设计模式之简单工厂/静态工厂模式

2023-10-30

在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦。

简单工厂模式/静态工厂模式其实不是一种设计模式,而算是一种编程思想。

以下讲解使用咖啡厅点咖啡来说明。

1.简单工厂模式

1.1.结构

简单工厂包含以下角色:

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

1.2.类图

在这里插入图片描述
解释:CoffeeStore类依赖于SimpleCoffeeFactory,SimpleCoffeeFactory依赖于抽象类Coffee,AmericanCoffee类和LatteCoffee类继承了Coffee类。

1.3.实现

抽象Coffee类


/**
 * @author 晓风残月Lx
 * @date 2023/6/18 21:58
 *      抽象咖啡
 */
public abstract class Coffee {

    public abstract String getName();

    // 加糖
    public void addSugar() {
        System.out.println("加糖");
    }

    // 加奶
    public void addMilk() {
        System.out.println("加奶");
    }

}

拿铁咖啡LatteCoffee类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:01
 *       拿铁咖啡
 */
public class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

美式咖啡AmericanCoffee类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:01
 *      美式咖啡
 */
public class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }
}

简单咖啡工厂SimpleCoffeeFactory 类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:17
 *      简单咖啡工厂类,用来生产咖啡
 */
public class SimpleCoffeeFactory {

    public Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("american".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("latte".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("对不起,您点的咖啡没有");
        }
        return coffee;
    }
}

咖啡店CoffeeStore类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:02
 *      咖啡店
 */
public class CoffeeStore {

    public Coffee orderCoffee(String type) {

        SimpleCoffeeFactory factory = new SimpleCoffeeFactory();

        Coffee coffee = factory.createCoffee(type);

        // 加配料
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }

}

测试类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:
 *      测试类
 */
public class Client {

    public static void main(String[] args) {
        // 1.创建咖啡店类
        CoffeeStore coffeeStore = new CoffeeStore();
        Coffee latteCoffee = coffeeStore.orderCoffee("latte");

        System.out.println(latteCoffee.getName());
     
    }
}

在这里插入图片描述

1.4.优缺点

优点:
封装了创建对象的过程,可以通过调用方法直接获取对象。把对象的创建和业务逻辑层分开,避免了修改客户代码。如果要实现新产品直接修改工厂类,而不需要在咖啡店CoffeeStore类中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

缺点:
增加新产品时还是需要修改工厂类的代码,违背了开闭原则。

2.静态工厂模式

静态工厂模式与简单工厂模式一致,只是在工厂类中的创建对象的功能定位为静态的。

2.1.实现

工厂类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:17
 *      静态咖啡工厂类,用来生产咖啡
 */
public class StaticCoffeeFactory {

    // 在方法上加个static(与简单工厂相比)
    public static Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("american".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("latte".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("对不起,您点的咖啡没有");
        }
        return coffee;
    }
}

咖啡店CoffeeStore类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:02
 *      咖啡店
 */
public class CoffeeStore {

    public Coffee orderCoffee(String type) {

        // 好处就是直接的调用方法
        Coffee coffee = StaticCoffeeFactory.createCoffee(type);

        // 加配料
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gof23设计模式之简单工厂/静态工厂模式 的相关文章

随机推荐

  • MySQL 表的 增删查改

    表的 CRUD 操作 一 新增 数据 Create 1 单行数据 全列插入 2 多行数据 指定列插入 二 查询 数据 Retrieve 1 全列查询 2 指定列查询 3 查询字段为表达式 4 别名 5 去重 distinct 6 排序 or
  • 假设一个登录页面,你会如何测试

    问题 假设是一个登陆页面 包括用户名 密码 登录 勾选框 注册 你会如何进行测试 1 功能测试 1 输入为空 点击提交 是否有错误信息 非空检查 2 输入正确的用户明 密码 点击提交 是否正确登录 正常登录 3 输入错误的用户明或者错误的密
  • C语言计算任意两日期之间天数

    今天复习了会Program in c 有道题目计算任意两个日期之间的天数 想了好久 最后写了一个很挫的程序 include
  • mybatis,中解决不进mapper,不报错 问题

    idea工具中spring boot使用 mybatis 中解决不进mapper 不报错 问题 在resources下的application properties 中配置 mybatis mapper locations classpat
  • 回归及相关模型

    线性回归模型 一元线性回归模型使用单一特征来预测响应值 拟合的最佳曲线通过最小化预测值和真实值之间的误差得到 多元回归模型利用多个自变量估计因变量 从而解释和预测因变量的值 优点 模型简单 部署方便 回归权重可以用于结果分析 训练快 缺点
  • C++的构造tips

    作者 匿名用户 链接 https www zhihu com question 30196513 answer 563560938 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 C 难就难在 在C 中你找不
  • 如何将一个cpp文件放入到已有ROS工作空间中编译通过以及如何调用第三方库

    如何将一个cpp文件放入到已有ROS工作空间中编译通过以及如何调用第三方库 1 创建一个新的功能包 catkin create pkg 自定义ROS包名 roscpp rospy std msgs 2 helloworld 在src中添加你
  • 基于Matlab的无标度网络仿真

    基于Matlab的无标度网络仿真 无标度网络 Scale Free Network 是一种网络拓扑结构 其度分布服从幂律分布 即只有少数节点具有非常高的度 这种网络结构在许多实际系统中都有广泛的应用 如社交网络 互联网和生物网络等 在本文中
  • Springboot打Jar并扫码jar包下的Bean

  • Qt学习总结——飞机大战小游戏制作

    Qt学习总结 飞机大战小游戏制作 1 需求分析 这篇文章写于2020年暑假 完成学校实训项目之后 对自己的项目实践做了一个总结 回顾整个项目的制作过程 同时也复习一下Qt的相关知识 总结项目制作过程中出现的不足之处 如果有同学想尝试使用Qt
  • 深度强化学习系列(2): ERROR: GLEW initalization error: Missing GL version

    当深度强化学习之 6 中的环境安装好之后 一阵欣喜 觉得可以干大事了 于是激动的不行 迫不及待的想看效果 然而幸福来的太快就容易让人失望的越厉害 因此美好的事情总是值得多次磨砺 废话不说了 爆出的错误是这样的 Running trained
  • 从零使用electron搭建桌面端可视化编辑器Dooring

    之前有朋友希望我基于H5 Dooring开发一款桌面端应用 最近刚好有时间 就花了小半天时间从零使用electron开发了桌面端的离线软件Dooring electron 因为之前用electron比较少 今天刚好学了一下 也基本把前后端打
  • sklearn中的make_moons函数使用

    主要参数作用如下 n numbers 生成样本数量 shuffle 是否打乱 类似于将数据集random一下 noise 默认是false 数据集是否加入高斯噪声 random state 生成随机种子 给定一个int型数据 能够保证每次生
  • Weblogic 12c 负载均衡和session复制

    在上一篇 我们介绍了weblogic集群的部署和session的复制 如何将请求负载均衡到这个三个服务器上呢 这里提供两种方式 1 weblogic自带的proxy代理 2 nginx实现负载均衡 一 通过proxy实现负载均衡 1 创建p
  • PyTorch动态神经网络

    PyTorch 是 PyTorch 在 Python 上的衍生 因为 PyTorch 是一个使用 PyTorch 语言的神经网络库 Torch 很好用 但是 Lua 又不是特别流行 所有开发团队将 Lua 的 Torch 移植到了更流行的语
  • 在linux下启动tomcat命令

    操作步骤 第一步 进入tomcat的bin目录 cd usr local tomcat bin 第二步 使用tomcat关闭命令 shutdown sh 第三步 查看tomcat是否关闭 ps ef grep java如果显示以下信息 则说
  • cherry-pick的定义和使用方法

    1 定义 使用遴选 cherry pick 命令 Git 可以让你将任何分支中的个别提交合并到你当前的 Git HEAD 分支中 当执行 git merge 或者 git rebase 时 一个分支的所有提交都会被合并 cherry pic
  • 使用jdbc连接oracle数据库

    1 导入架包ojdbc14 2 编写工具类 package utils import java sql Connection import java sql DriverManager import java sql SQLExceptio
  • Axure RP 9最新版的授权码(专业版)亲测可用

    分享AxureRP9授权码和密钥 Axure RP9分为专业版 Pro 团队版 Team 和企业版 Enterprise 其中企业版功能最为强大 下面分享几个Axure RP 9最新版的授权码 专业版 亲测可用 被授权人 License A
  • Gof23设计模式之简单工厂/静态工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可