二、工厂模式——在工厂里能找到你的对象
文章目录
- 工厂模式
- 1. 简单工厂
- 2. 缓存方式
- 3. 工厂模式
- 4. 工厂的工厂
- 5. 抽象工厂
- 6. 工厂模式与IOC容器
- 总结
设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。
创建型 包含了 单例模式、工厂模式、建造者模式、原型模式。
工厂模式
对于一个类对象,如果构建比较复杂,我们可以将这部分复杂的部分抽取出来,由工厂类来解决这部分复杂的处理逻辑。
1. 简单工厂
用于解决复杂对象的构建。
public class CarObject {}public class Factory{public static CarObject getInstance(String obj) {return new CarObject();}
}
2. 缓存方式
可以将对象缓存起来,提升获取对象的效率和性能,屏蔽对象创建的复杂性。
其中Engine;Baseplate;GearBox;Tyre
可以都继承于某个基类CarObject
。
public class CarObject {}
public class Engine extends CarObject{}
public class Baseplate extends CarObject{}
public class GearBox extends CarObject{}
public class Tyre extends CarObject{}public class Factory{private static final Map<String,CarObject> cachedpool = new HashMap<>();static {cachedpool.put("发动机",new Engine());cachedpool.put("底盘",new Baseplate());cachedpool.put("变速箱",new GearBox());cachedpool.put("轮胎",new Tyre());}public static CarObject getInstance(String type) {return cachedpool.get(type);}
}
3. 工厂模式
使用多态设计,设计1个工厂接口,以及多个工厂类实现该接口。当需要什么部件时就使用对应的工厂类。
public interface Ifactory{CarObject getInstance();
}public class EngineFactory implements Ifactory {public CarObject getInstance(){return new Engine();}
}public class BaseplateFactory implements Ifactory {public CarObject getInstance(){return new Baseplate();}
}public class GearBoxFactory implements Ifactory {public CarObject getInstance(){return new GearBox();}
}public class TyreFactory implements Ifactory {public CarObject getInstance(){return new Tyre();}
}
4. 工厂的工厂
可以将工厂再次抽象为一个产品,还可以缓存起来,根据需要生成不同的工厂对象。
public class Factory{private static final Map<String, Ifactory> cachedpool = new HashMap<>();static {cachedpool.put("发动机",new EngineFactory());cachedpool.put("底盘",new BaseplateFactory());cachedpool.put("变速箱",new GearBoxFactory());cachedpool.put("轮胎",new TyreFactory());}public static Ifactory getFactory(String type) {return cachedpool.get(type);}
}
5. 抽象工厂
当需要生产的对象是产品族时,可以使用抽象工厂。抽象工厂类定义产品,具体的工厂类生产对应的型号产品。
比如飞机工厂和汽车工厂都生产这四个产品,那么调用飞机工厂时,返回的对象是飞机型号的。这样可以很方便的切换产品线。
首先定义产品类。
public class Baseplate {}class CarBaseplate extends Baseplate{}class PlaneBaseplate extends Baseplate{}public class Engine {}class CarEngine extends Engine{}class PlaneEngine extends Engine{}public class GearBox {}class CarGearBox extends GearBox{}
class PlaneGearBox extends GearBox {}public class Tyre {}class CarTyre extends Tyre{}
class PlaneTyre extends Tyre{}
然后定义抽象工厂和具体的工厂。这样当需要什么样的产品族,调用对应的工厂类,可以快速切换产品族。
public interface Ifactory{Engine getEngine();Baseplate getBaseplate();GearBox getGearBox();Tyre getTyre();
}public class PlaneFactory implements Ifactory {public Engine getEngine(){return new PlaneEngine();}public Baseplate getBaseplate(){return new PlaneBaseplate();}public GearBox getGearBox(){return new PlaneGearBox();}public Tyre getTyre(){return new PlaneTyre();}
}public class CarFactory implements Ifactory {public Engine getEngine(){return new CarEngine();}public Baseplate getBaseplate(){return new CarBaseplate();}public GearBox getGearBox(){return new CarGearBox();}public Tyre getTyre(){return new CarTyre();}
}
6. 工厂模式与IOC容器
两者的思路都是基于工厂模式,但IOC容器更加强大复杂,IOC容器通过反射动态加载创建对象。一、能够根据配置文件解析。二、支持原型模式、单例模式创建对象。三、支持Bean生命周期管理,如懒加载,能够配置对象的 init 和 destory。
总结
工厂模式将构建对象的职责封装起来了,增加了代码复用性。抽象工厂能够快速将一组产品替换为另一组。工厂模式是思路在IOC容器中使用到,但IOC容器是依托反射实现对象构造的。
设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。
二、工厂模式——在工厂里能找到你的对象相关推荐
- JavaScript 前端简单工厂模式、工厂方法模式、抽象工厂模式优缺点及详解 — 设计模式《二》
工厂模式 前言:就前端 JavaScript 语言来说,可以把简单工厂模式.工厂方法模式.抽象工厂模式归纳为一种即工厂模式: 一. 简单工厂模式 介绍/概述: 简单工厂模式的工厂类一般是使用静态方法, ...
- 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)
一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3) ...
- 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...
- 深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解
文章目录 前言 一.简单工厂模式 1.描述 2.特点 3.优缺点 4.类图说明 二.工厂方法模式 1.描述 2.特点 3.适用场景 4.类图说明 5.简单工厂模式与工厂方法模式区别: 三.抽象工厂模式 ...
- 简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是设计模式的一类:对于设计模式这个概念 ...
最新文章
- X3650M3 客户端联不上加密狗!
- 加入/ LINQ和Lambda的位置
- django中如何优雅的处理一个多按钮的表单
- 再见 JDK ...
- java 三元 代替 if_Java 中三元和 if else 哪个的效率比较高,有底层解释吗,谢谢了!...
- 转https_免费!这个PPT转PDF的方法不学可惜!
- java 管理后台前台分离_系统前台后台是否应该分离(包括部署)
- 移动客户端UI设计指南
- Visual Studio Code 构建C/C++开发环境
- 解决mescroll固定位置上拉加载无效果?真的只需一步
- 南通市城管局推动“数字化城管”向“智慧城管”升级
- S32DS中链接文件及启动代码学习
- 大数据平台及挖掘调研
- 【线性代数】行列式和矩阵的关系
- 关闭 Eureka 的自我保护机制
- 组合数学之二 —— 容斥原理及应用
- 【ROOT from CERN】——TSpectrum2类与二维寻峰
- parameterType、parameterMap与resultMap
- 畅游CTO洪晓健:BW和CE3游戏引擎各取所长
- JAVA项目:后台管理页面——显示数据库中所有信息+删除和编辑(MySQL)
热门文章
- 43 迷宫问题(避免走重复路径)
- js+html+css实现本地聊天室
- 520这份花式表白攻略请查收
- MUI底部菜单栏 uniapp 底部菜单栏
- 【Midjourney】Midjourney Prompt 提示词 ① ( 贴纸风格 | A 扮演 B 角色 | 对称扁平 Logo 图标设计 | 列表图片 | 平行 / 直角 排列元素 )
- Android模拟键盘和键盘监听
- 业界个人观系列 msup技术开放日
- 大型建企招聘,大量岗位可选择
- swt入门---http://www.blogjava.net/dreamstone/archive/2007/08/02/134074.html
- Java正则表达式及Pattern与Matcher使用详解