工厂设计模式3
一、简单工厂模式
定义:简单工厂就是用来创建其它类的实例。
简单工厂模式代码三个主体:1.工厂类 2.抽象产品 3.具体产品
从上述代码来看,简单工厂也就是说,有一个生产特定接口实现类的工厂,生产出来的实现类向上转型为它的接口形式。对于拥有这个简单工厂的类来说,它用工厂创建有特定功能的产品对象,从而使用产品的功能。它不关心具体产品的构造过程,这个过程交给简单工厂来做了,就像我们的主函数中调用的那样。
优点:客户端中的用到的产品对象由工厂制造,因此客户端的代码是不用动的。
缺点:工厂类含有必要的判断逻辑,逻辑判断可能会过于复杂,不好维护。所以说,简单工厂的适用环境是当产品对象不多的时候。
//用来生产手机的工厂
public class Facory {
public static Mobile createMobile(String name){
if(name.equals("华为")){
//经过若干道工序后,生产出华为手机
return new HuaWeiMobile();
}
if(name.equals("苹果")){
//也经过若干道工序后,生产出苹果手机
return new AppleMobile();
}
throw new IllegalArgumentException("参数错误");
}
//主函数可以视为实际调用环境
public static void main(String[] args) {
Mobile mobile = Facory.createMobile("华为");
mobile.call();
}
}
//抽象产品,手机
interface Mobile{
void call();
}
//具体产品,华为手机
class HuaWeiMobile implements Mobile{
@Override
public void call() {
//华为手机打电话
}
}
//具体产品,苹果手机
class AppleMobile implements Mobile{
@Override
public void call() {
//苹果手机打电话
}
}
二、工厂方法模式
工厂方法模式克服了简单工厂的一些缺点。简单工厂如果增加一个新的类型的产品,那么就要修改简单工厂中的构造产品的代码,比如这个例子里面要在createMobile方法里面增加代码。这不符合开放闭合原则,修改了以前的代码。工厂方法模式是将工厂也抽象,每一个具体的产品有一个生产它的工厂。
工厂方法模式代码的4个主体:1.抽象工厂 2.具体工厂 3.抽象产品(具有特定功能的产品,将这个功能抽取为接口) 4.具体产品。
//抽象工厂,生产手机的工厂
public abstract class AbstractMobileFacory {
public abstract Mobile createMobile();
}
//具体工厂,生产华为手机的工厂
class HuaWeiMobileFactory extends AbstractMobileFacory{
@Override
public Mobile createMobile() {
return new HuaWeiMobile();
}
}
//具体工厂,生产苹果手机的工厂
class AppleMobileFactory extends AbstractMobileFacory{
@Override
public Mobile createMobile() {
return new AppleMobile();
}
}
//抽象产品,手机,具有抽象功能,打电话
interface Mobile{
void call();
}
//具体产品,华为手机
class HuaWeiMobile implements Mobile{
@Override
public void call() {
//华为手机打电话
}
}
//具体产品,苹果手机
class AppleMobile implements Mobile{
@Override
public void call() {
//苹果手机打电话
}
}
这样的代码符合开放闭合原则,如果现在需求变化,要求新增生产小米手机。那么我们以前写的代码不需要修改,只要添加class XiaoMiMobile 以及XiaoMiMobileFactory即可。这样对于我们重用旧代码,增加新代码,都有好处。工厂方法模式的优势,即“代码复用性”与“扩展性”都体现了出来。
三、优缺点
简单工厂模式的优点:调用者无须关系产品对象的创建过程。 适合产品对象比较少的情况。
简单工厂模式的缺点:将所有产品类的创建都放到了简单工厂里面,如果要添加新的产品类,不得不修改简单工厂,这违反了开放闭合原则(既能进行扩展,又不修改源代码)。
工厂方法模式的优点:符合开放闭合原则,对于新添加的类,它只需要添加新的类和新类的工厂,无须修改已有的类和工厂。代码复用性与系统的扩展性较高。
工厂方法模式的缺点:由于每增加一个产品对象,都要新增产品对象的类及其工厂,增加了代码开发量。
四、使用心得
刚开始学习工厂模式的时候,觉得工厂模式没有用,就是把对象的创建放到了工厂里面。后来实际编码后,发现工厂模式是一种非常重要的模式。工厂模式最大的好处就是:在团队开发里面,调用者与产品对象的创建分离。调用者的类里面只需要工厂对象,不需要知道具体产品是如何构造出来的(这个具体产品的构造也许十分复杂,需要读取配置文件)。调用者只关心具体的功能,这个功能被抽象为接口,工厂只需返回接口的实现类。简单说:调用环境避免了与“产品对象复杂的构造逻辑”耦合。
举个例子:B包是我们的调用者,它需要一个A功能。A包中将这个A功能抽象为一个接口interface A,并拥有100种接口A的实现类。在B包的调用环境中,它只需要A功能,不关心A的具体实现。因此,它希望new一个A的实现类,但是又不想与具体的A的实现类代码耦合,原因是A的实现类构造函数也许十分复杂。现在将A包中实现类的创建全部转移到工厂AFactory里面,对于B包的调用环境来说,只需要拥有一个AFactory,就能根据不同的情况获取不同的A的实现类(B通过阅读A开发者提供的API文档),从而返回A接口的具体实现,完成功能的实现。这样做的好处是,将A复杂的构造过程全部转移到AFactory里面,B开发者的开发环境里只与AFactory和A接口耦合,不与具体的A实现类耦合,这降低了不同的包之间的耦合程度。
刻意练习
(1)简单工厂的基本解释 (1)工厂方法模式的基本解释
(2)简单工厂模式的类图 (2)工厂方法模式的类图
(3)简单工厂的三个主体 (3)工厂方法模式的四个主体
(4)简单工厂的优缺点 (4)工厂方法模式的优缺点
(5)简单工厂的适用环境 (5)工厂方法模式的适用环境
分割线--------------------------------------------------------------------------------------------
下一篇:适配器设计模式4