工厂设计模式3

一、简单工厂模式

        定义:简单工厂就是用来创建其它类的实例。

        简单工厂模式代码三个主体:1.工厂类   2.抽象产品   3.具体产品

        ../_images/SimpleFactory.jpg

 

        从上述代码来看,简单工厂也就是说,有一个生产特定接口实现类的工厂,生产出来的实现类向上转型为它的接口形式。对于拥有这个简单工厂的类来说,它用工厂创建有特定功能的产品对象,从而使用产品的功能。它不关心具体产品的构造过程,这个过程交给简单工厂来做了,就像我们的主函数中调用的那样。

        优点:客户端中的用到的产品对象由工厂制造,因此客户端的代码是不用动的。

        缺点:工厂类含有必要的判断逻辑,逻辑判断可能会过于复杂,不好维护。所以说,简单工厂的适用环境是当产品对象不多的时候。

//用来生产手机的工厂
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() {
        //苹果手机打电话
    }
}

二、工厂方法模式

../_images/FactoryMethod.jpg

        工厂方法模式克服了简单工厂的一些缺点。简单工厂如果增加一个新的类型的产品,那么就要修改简单工厂中的构造产品的代码,比如这个例子里面要在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

 

posted @ 2022-07-17 12:15  小大宇  阅读(18)  评论(0编辑  收藏  举报