设计模式-抽象工厂模式+单例
时间:2022-07-25
本文章向大家介绍设计模式-抽象工厂模式+单例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
抽象工厂是什么?
抽象工厂是创建型模式的一种,也叫超级工厂。抽象工厂是普通工厂的升级版,是一个专门生产工厂用的抽象工厂。
抽象工厂可以干嘛?
主要解决一个在单一工厂的时候,想要创造多个工厂很繁琐和臃肿并且耦合度也很高。比如:生产小米手机的不同版本8、9、10肯定是不同流水线,如果按照原来的工厂模式,要再造一个工厂再来生产,这样的话就费时费力,并且很繁琐,将生产小米的工厂抽象为一个超级工厂,通过这个超级工厂下面去创建8、9、10不同的工厂,很好的遵循了开-闭原则。这个就像一个公司成为了一个总公司,不同的子公司复制不同的模式。一个总公司下面有N多子公司一样。而总公司是一个超级工厂,子公司就像不同工厂。每个子公司经营不同的业务/产品。
优点:
- 降低耦合
- 符合开闭原则
- 符合单一原则
缺点:
会使代码关系复杂、庞大、看起来很难理解;
类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: csh
* @Date: 2020/5/17 17:02
* @Description:抽象手机接口
*/
public interface AbstractMoblie {
void showModel();
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:41
* @Description:具体手机接口
*/
public interface EightMobile extends AbstractMoblie {
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:49
* @Description:小米8实现
*/
public class EightMobileImpl implements EightMobile {
//单列
private EightMobileImpl(){
}
//单列 饿汉
private static EightMobileImpl eightMobile = new EightMobileImpl();
public static final EightMobileImpl getInstance(){
return eightMobile;
}
@Override
public void showModel() {
System.out.println("小米8");
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:41
* @Description:具体手机接口
*/
public interface NightMobile extends AbstractMoblie {
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:49
* @Description:小米9
*/
public class NightMobileImpl implements NightMobile {
private static NightMobileImpl nightMobile = new NightMobileImpl();
private NightMobileImpl() {
}
//单列 饿汉
public static final NightMobileImpl getInstance(){
return nightMobile;
}
@Override
public void showModel() {
System.out.println("小米9");
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:41
* @Description:小米10接口
*/
public interface TenMobile extends AbstractMoblie{
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:50
* @Description:小米10实现
*/
public class TenMobileImpl implements TenMobile {
private static TenMobileImpl tenMobile = new TenMobileImpl();
private TenMobileImpl(){
}
public static final TenMobileImpl getInstance(){
return tenMobile;
}
@Override
public void showModel() {
System.out.println("小米10");
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:44
* @Description:手机工厂(超级工厂)
*/
public interface IMobileFactory {
//创建手机
AbstractMoblie crateEightMobile();
}
/**
* @Auther: csh
* @Date: 2020/5/17 17:44
* @Description:小米8工厂实现
*/
public class EightMoblieFactoryImpl implements IMobileFactory {
//单例
private static final EightMoblieFactoryImpl moblieFacotry = new EightMoblieFactoryImpl();
private EightMoblieFactoryImpl(){
}
public static EightMoblieFactoryImpl getInstance(){
return moblieFacotry;
}
@Override
public AbstractMoblie crateEightMobile() {
return EightMobileImpl.getInstance();
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 17:44
* @Description:小米9工厂实现
*/
public class NightMoblieFactoryImpl implements IMobileFactory {
//单例
private static final NightMoblieFactoryImpl moblieFacotry = new NightMoblieFactoryImpl();
private NightMoblieFactoryImpl(){
}
public static NightMoblieFactoryImpl getInstance(){
return moblieFacotry;
}
@Override
public AbstractMoblie crateEightMobile() {
return NightMobileImpl.getInstance();
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 17:44
* @Description:小米10工厂实现
*/
public class TenMoblieFactoryImpl implements IMobileFactory {
//单例
private static final TenMoblieFactoryImpl moblieFacotry = new TenMoblieFactoryImpl();
private TenMoblieFactoryImpl(){
}
public static TenMoblieFactoryImpl getInstance(){
return moblieFacotry;
}
@Override
public AbstractMoblie crateEightMobile() {
return TenMobileImpl.getInstance();
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:56
* @Description:通过不同的工厂类创建
*/
public class Client {
public static void main(String[] args) {
//小米8
IMobileFactory eightFactory =EightMoblieFactoryImpl.getInstance();
AbstractMoblie eightMobile = eightFactory.crateEightMobile();
eightMobile.showModel();
//小米9
IMobileFactory mobileFactory =NightMoblieFactoryImpl.getInstance();
AbstractMoblie nightMobile = mobileFactory.crateEightMobile();
nightMobile.showModel();
//小米10
IMobileFactory tenFactory =NightMoblieFactoryImpl.getInstance();
AbstractMoblie tenMobile = tenFactory.crateEightMobile();
tenMobile.showModel();
}
}
结果
小米8
小米9
小米10
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后:
其实如果产品迭代非常快,而原来的产品并存使用,抽象工厂是非常合适的,抽象出来一个超级类,然后通过该类去实现不同的新业务,比如:支付接口、USB接口等。但是如果不同相同品类的不太建议,因为这样搞会非常复杂。
- 比较一下以“反射”和“表达式”执行方法的性能差异
- 人工智能芯片是什么?有什么用?
- 柯洁食言“复出”再战AI:明年4月见分晓
- 深入探讨ASP.NET MVC的筛选器
- pytorch自然语言处理之Pooling层的句子分类
- su命令cannot set groups: Operation not permitted的解决方法
- 利用腾讯云 COS 云对象存储定时远程备份网站
- 腾讯云技术公开课:零基础入门高可用云端架构设计
- 包学会之浅入浅出Vue.js:开学篇
- 包学会之浅入浅出Vue.js:升学篇
- 一个只有99行代码的JS流程框架 (一)
- 【腾讯云的1001种玩法】试用腾讯云 Windows Server 2012 R2 镜像的几点经验分享
- 一个只有99行代码的JS流程框架(二)
- 看书的时候如何调试书中简单的C+代码?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用关键点进行小目标检测
- 彻底搞懂 etcd 系列文章(八):etcd 事务 API
- 使用docker搭建一套开发环境全家桶
- TypeScript里的.d.ts语法
- 宋宝华:当Linux内核遭遇鲨鱼—kernelshark
- 基于Pytorch的动态卷积复现
- SAP Spartacus的StorefrontConfig对象
- Linux内核虚拟内存管理之匿名映射缺页异常分析
- Elasticsearch:如何把 Elasticsearch 中的数据导出为 CSV 格式的文件
- Nginx 负载均衡配置(实战教程)
- 教懂你什么是 “ 流量劫持 ”
- SAP Spartacus中使用到的Angular ModuleWithProviders类型
- 架构设计 | 基于消息中间件,图解柔性事务一致性
- 结构与算法(02):队列和栈结构
- 用Gaussian寻找圆锥交叉点