IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 优雅のJava(三)—— 优雅的制造对象是怎么实现的?工厂模式 -> 正文阅读

[Java知识库]优雅のJava(三)—— 优雅的制造对象是怎么实现的?工厂模式

专栏导航

优雅のJava(零)—— 面向问题的学习

前言

之前我们讲过单例的几种实例方法
我们把视角放广远一点 其实Java往往是自顶而下的设计 先指定接口interface 指定父类 制定标准 再考虑具体该怎么实现! 所以这个组件往往不是仅仅是一个单例的问题!可能是一个接口-实现类的大树 或者父类-子类的树 还有混合接口、抽象父类、具体子类的结构

那么问题在于 假设我有个组件 它所依赖的组件 具有多个实现 我应该选择哪个?抑或是 有多个子类 我应该选择哪个?

这时又出现了类似第六篇我们将会提到的问题——调用者需要为被调用者考虑 耦合度太高了 万一被调用者出什么问题 调用者不是GG?全都要改?

举个不太恰当的例子 老师收作业 同学交作业 作业形式可能有纸质 可能在线文档 可能word文档 可能markdown文档 高效的老师不会管 你哪个同学具体用什么形式给(子类实现)他只会让学生交纸质 其他的自己想办法打印 (学生来管 老师只是指定规则而已)

我们这里的工厂模式 就是老师调用的收作业组件 同学怎么转 用哪个实现 老师不管 老师设定标准 同学自己解决(工厂内部 根据老师的参数 决定该用哪个实现 然后输出)

总结起来 以下场合需要工厂模式:

  • 客户类不关心应该使用哪种实现 只制定接口 功能
  • 创建过程复杂 应当对客户透明
  • 让客户不用烦心该选什么子类 应该是你去给客户提供 合适客户的实现 而不是客户头疼该用哪个
  • 延迟实现初始化

最后一个延迟实现 虽然用到了单例的延迟实现思路 但 具体来说 比如本来100个实现子类 其实能用到的就10个 那 让调用者调用工厂的时候 工厂决定应该用哪个实现 相当于延迟到工厂了

工厂方法

这里是工厂 工厂也往往又很复杂的继承合成结构 这里就简单设置为一个接口+实现的方式 我们主要使用ConcreteFactory来造车

	public interface Factory{
		Car manufactCar(Integer mode);
	}
	
	public class ConcreateFactory implements Factory{
		public Car manufactCar(Integer mode, Integer price) {
			if(mode == 1) return new Benz(price);
			else return new BWM(price); 
		}
	}
	

明显能看到 这里 是工厂决定应该怎么实例化 而客户只需要提供mode 以及价钱即可 余下的实例化问题由工厂操心!

这是车 接口为车 都能开 有两种实现


	public interface Car {
		Integer price;
		Car drive();
	}
	public class Benz implements Car{
		public Benz (price){
			this.price = price;
		}
		public String drive(){
			return "That's a driving Benz which worth $" + price;
		}
	}
	
	public class BWM implements Car{
		public BWM (price){
			this.price = price;
		}
		public String drive(){
			return "That's a driving BWM which worth $" + price;
		}
	}

自然我们客户端只需要:


	public class Client{
		private Factory factory; //选用哪个工厂
		
		public Client(Factory factory){
			this.factory = factory;
		}
		public void getAndDriveMyCar(){
			Car myCar = factory.manufactCar(1, 10000);
		}
		public static void main(String[] args){
			Client me = new Client(new ConcreteFactory()); // 工厂是哪个你还是需要选的
			client.getAndDriveMyCar();
		}
	}
	

实际上客户端调用真就一句话Car myCar = factory.manufactCar(1, 10000);

静态工厂方法

其实我们可以发现concreteFactory根本就没有必要实例化 除非生产的汽车需要单例 那样的话单例和工厂都需要单例 由IOC容器维护

如果不需要单例 比如我们Integer.ValueOf 实际上返回的Integer对象当然是多例的

这样的话 我们还可以使用静态工厂方法 比如参考Integer valueof

	
	public static Integer valueOf(int i) {
		if(i >= -128 && i <= IntegerCache.high)
			return IntegerCache.cache[i + 128];
		else 
			return new Integer(i);
	}
	

这个valueOf其实就是个简单的静态工厂方法 看到没 这相当于Car类里边直接设置静态工厂方法就完事了 还需要什么工厂类呢?

当然话说回来 仅限这种简单的实例化 而且不是单例的工厂

后记

下一篇我们将聊聊代理 之前是单例对象的创建 现在是普通对象的一般创建方法 代理模式又是什么?为什么使用代理 尤其是动态代理 下一篇为你揭晓

专栏导航
优雅のJava(零)—— 面向问题的学习

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:51:23  更:2022-01-11 23:53:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:12:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码