当前位置: 首页 > news >正文

简单工厂(Simple Factory)

简单工厂(Simple Factory)

在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。

说明:

简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。

这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。

简单工厂模式中,一个工厂类处于对产品类实例化的中心位置上,它知道每一个产品,它决定哪一个产品类应当被实例化。这个模式的优点是允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无须修改客户端,即在某种程度上支持“开-闭”原则。这个模式的缺点是对“开-闭”原则的支持不够,因为如果有新的产品加入到系统中,则需要修改工厂类,将必要的逻辑加入到工厂类中。

案例:

抽象产品

 * 奖品*/
public interface Prize {boolean sendGoods(String id, String count);}

产品Phone:

@Slf4j
public class Phone implements Prize{@Overridepublic boolean sendGoods(String id, String count) {log.info("发送手机开始 , id: {}, count: {}", id, count);long startTime = System.currentTimeMillis();log.info("发送手机结束 , 耗时: {}", System.currentTimeMillis() - startTime);return false;}
}

产品优惠券

@Slf4j
public class Coupon implements Prize {@Overridepublic boolean sendGoods(String id, String count) {log.info("发送优惠券开始 , id: {}, count: {}", id, count);long startTime = System.currentTimeMillis();log.info("发送优惠券结束 , 耗时: {}", System.currentTimeMillis() - startTime);return false;}
}

产品自行车

@Slf4j
public class Bicycle implements Prize{@Overridepublic boolean sendGoods(String id, String count) {log.info("发送自行车开始 , id: {}, count: {}", id, count);long startTime = System.currentTimeMillis();log.info("发送自行车结束 , 耗时: {}", System.currentTimeMillis() - startTime);return false;}
}

工厂

public enum PrizeTypeEnum {PHONE,BICYCLE,COUPON;
}public class PrizeFactory {// 生成奖品对象public static Prize getPrize(PrizeTypeEnum prizeTypeEnum) {if (Objects.isNull(prizeTypeEnum))return null;if (prizeTypeEnum.equals(PrizeTypeEnum.COUPON))return new Coupon();if (prizeTypeEnum.equals(PrizeTypeEnum.PHONE))return new Phone();if (prizeTypeEnum.equals(PrizeTypeEnum.BICYCLE))return new Bicycle();throw new RuntimeException("不存在的奖品类型");}public static void main(String[] args) {Prize prize = PrizeFactory.getPrize(PrizeTypeEnum.BICYCLE);prize.sendGoods("1","1"); }}
http://www.lryc.cn/news/471208.html

相关文章:

  • ffmpeg拉流分段存储到文件-笔记
  • Java 实习工资大概是多少?——解读影响薪资的因素
  • 【Linux】万字详解:Linux文件系统与软硬链接
  • spacenavd
  • C#WPF的XAML的语法详谈和特性
  • 一篇文章讲透数据结构之二叉搜索树
  • 新手入门c++(8)
  • 新手铲屎官提问,有哪几款噪音低的宠物空气净化器推荐
  • 解决RabbitMQ脑裂问题
  • 经纬恒润AUTOSAR成功适配芯钛科技Alioth TTA8车规级芯片
  • 4、java random随机数、一维数组、二维数组
  • C++ 魔法三钥:解锁高效编程的封装、继承与多态
  • 姿态传感器(学习笔记上)
  • labelimg使用教程
  • 力扣21 : 合并两个有序链表
  • 【Spring】Spring Boot 配置文件(7)
  • 《向量数据库指南》——解锁Wikipedia文章向量的跨语言搜索秘籍
  • 【力扣 + 牛客 | SQL题 | 每日5题】牛客SQL热题204,201,215
  • 下载数据集用于图像分类并自动分为训练集和测试集方法
  • Python xlrd库介绍
  • Javascript立即执行函数
  • Linux相关概念和易错知识点(17)(文件、文件的系统调用接口、C语言标准流)
  • 三防加固工业平板国产化的现状与展望
  • 3.1.3 看对于“肮脏”页面的处理
  • 学 Python 还是学 Java?——来自程序员的世纪困惑!
  • Spring Web MVC 入门
  • 吃牛羊肉的季节来了,快来看看怎么陈列与销售!
  • 租房业务全流程管理:Spring Boot系统应用
  • GCC之编译(7)Linker链接脚本
  • 【设计模式系列】适配器模式(九)