设计模式——创建型模式之工厂模式

设计模式

系列文章:

一、创建型模式——工厂模式
二、创建型模式——单例模式、原型模式
三、创建型模式——建造者模式
四、结构型模式——装饰者模式
五、结构型模式——代理、适配器模式




一、什么是工厂模式?

工厂模式:简单的说就是代理创建对象的模式,定义一个类来负责其他类(一般是同类型、不同产品——比如不同型号的汽车)的创建的一种设计思维。

  • ps: 所谓 设计模式 就是前人总结的设计类的模板——想象一下:当在求职时被问到一个大概的需求时,能够清晰直接的对他说:“这个可以用这种设计模式来做,具体的方法时…”,这种就像英语等级考试作文就是你背的那篇模板一样的清晰思路会给你多大的自信就不言而喻了吧。

从工厂模式的定义可以看出:它是为了创建对象服务的,属于创建型模式的一种,除此之外——还有单例模式、原型模式、建造者模式。

二、为什么需要这些?

  • 创建对象?不就是new吗,有什么难的…
    想象一下:当你面对超过10个以上的类被一堆类创建使用,而且突然发现这几个类有bug需要修改的时候,你不得不去挨个查找引用,并修改构造函数的传入参数(这时候你修改完了又发现你某个参数好像写错了…remake毁灭吧)

这时候你需要一个工厂帮你负责创建对象,其实在你开始写代码之前就需要了解,不过现在开始学也不晚。这里我用《软件设计模式实用教程》的一个例子:设计一个负责汽车生产的框架,要求能够输出不同型号车辆的信息。

你可以很快编写出如下代码:

static void main(String[] args){
	while(1){
		carType="//输入你需要的型号"
		switch(carType){
			case "type1":
				//输出你需要的信息;
				break;
			case "type2":
				//.....
				break;
			......
		}
	}
}

很明显的是这不是一个面向对象的设计,然后你会发现如果需要添加一个新的车类型,或者需要修改一些参数,你得在不同的地方修改,还很有可能影响其他部分。

三、具体起了什么作用?

了解到直接莽代码的问题之后,现在你知道了需要好好冷静思考了。
现在我们为此创建一些车辆类型,并使用简单工厂模式的帮助看看:

static void main(String[] args){
	Factory factory=new Factory();
	while(1){
		carType="//输入你需要的型号"
		Car car=factory.creatNewCar(carType);
		car.printMessage();
	}
}

这是多么的简洁明了啊——具体的类图如下:(imblog.csdnimg.cn/afc7cfb0bc40a1964a0e8a508a22df.XEcUpng?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmxhY2tfZm94Xw==,size_20,color_FFFFFF,t_70,g_se,x_16)?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmxhY2tfZm94Xw==,size_20,color_FFFFFF,t_70,g_se,x_)]
其中Factory类负责根据传入的参数创建一个具体的Car对象,只要通过多态调用,就能方便的 实现扩展维护主体的简洁性
当然:类变多了,这也使得你的设计更复杂,但是当代码需要修改时,你会惊叹道:这种结构严谨的代码是我能写出来的!!

四、简单工厂模式、工厂方法模式、抽象工厂模式?

4.1 简单工厂模式:具体就是创建一个工厂类,负责对具体的输入,判断,创建出一个具体的对象。(注意其中的判断和原本的代码可能没有什么区别,只是避免了它出现在主体代码中让你心烦)

  • 考虑一个问题,如果我们需要添加一个产品(也就是一种新的车类型),我们还是需要去在Factory类里面修改,也可能影响其他对象的判断创建,如果我们有超过10个类呢?可能需要写一长串 switch-case 代码或者一大堆 if-else

具体的例子见上:

4.2 工厂方法模式:创建多个工厂分别负责各自对象的创建,其好处是避免了复杂判断,也可以利用多态和反射动态修改创建方法。但是类更多了,更复杂。(我一般把它理解成一个工厂-多条流水线的方法)

比如如下的代码:

static void main(String[] args){
	Factory factory=null;
	while(1){
		factoryFlowline="//输入流水线名字"
		//反射方法,动态创建类
		//创建一个类名为"factoryFlowline"的实例
		factory=(Factory)Class.forName(factoryFlowline).newInstace();
		Car car=factory.creatNewCar(carType);
		car.printMessage();
	}
}

类图如下:
在这里插入图片描述
把工厂作为一个父类总体,然后派生出一系列子类(这里我称为工厂中的产业流水线),由具体的子类负责创建不同的产品对象。该模式具有更高的扩展性,且不会影响原有的类,实现了判断产品逻辑的切分。

  • 和上面那个方法比较,考虑添加一个新产品类的情况,不难发现工厂方法类不需要修改任何现有的类,而是直接添加一个产品类和相应的工厂方法类(产业流水线类)。不过类明显变多了,而且用起来没有之前那个简单版本方便——好的结构往往以复杂的设计收场,在实际设计中谨慎取用

4.3 抽象工厂模式:创建多个工厂分别负责多个对象的创建,在工厂方法模式的基础上,增加了原来简单工厂模式的特点,解决的是不同工厂生产不同产品不同型号的问题。(比如A工厂加工国内销售汽车,B工厂生产出口汽车——生产的产品种类相同,但是总的标准不同)

这里直接用类图讲解:
在这里插入图片描述简单的说:就是创建两种标准下的多种产品的问题,为了实现良好的类间解耦,采用了更复杂的抽象工厂模式——顾名思义,工厂成为了抽象的父类,每个具体的工厂实现都要负责各自标准下的多种对象的创建工作。{ 产品数目(m)x 标准数目(n)+产品父类(m)+工厂父类(1)} 使得该模式在简单情况下就显得很复杂。

  • 工厂模式都是为了创建多类型对象所使用的一种设计方法,在面对上述的 —— 一个类有多种派生子类需要在主体中多次创建使用;判断逻辑较为复杂,需要更加解耦的方式,能够熟练使用反射设计;多种类+多种标准,让人一看就觉得应该用抽象工厂的时候。在设计过程中深思熟虑,不要盲目行事

求赞

作者长期更新,如果觉得本文还算不错的话,请给我一个大大的赞!!!
如果非常赞同这篇文章,请关注我,持续了解更多精彩博文!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值