个人Java设计模式-工厂方法模式

女友dodo闹脾气,气势汹汹的说“我要吃雪糕”。笔者内心啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?!git

可是,雪糕买回来了,她居然说“不想吃雪糕了,忽然想吃披萨”。呵呵了,憋了一股劲“没问题”,又屁颠屁颠的去把披萨买回来。github

世事难料,dodo同窗又放大招了,“披萨太上火了,我要吃芝士蛋糕”。设计模式

这时候,工厂方法模式该上场了,使用它能够完美的解决不断的产品变动。工厂方法模式是怎么样的?而工厂模式又是怎样解决产品变动呢?一块儿来看看...架构

1、工厂方法模式

定义

  定义一个建立对象的工厂接口,工厂方法将实例化推迟到子类中。ide

定义老是抽象的,先放出工厂方法模式的UML图以下所示:spa

工厂方法模式UML.png

从上图能够看出,工厂方法模式涉及到如下四个角色的概念:设计

  - 抽象工厂角色:工厂方法模式的核心,建立产品的工厂类必须实现该接口。code

  - 具体工厂角色:该角色实现了抽象工厂接口,具体如何建立产品类就是在该实现类完成。对象

  - 抽象产品角色:全部产品类的超类,负责实现产品共性的抽象定义。接口

  - 具体产品角色:该角色实现了抽象产品接口,负责具体的不一样产品业务逻辑。

2、实战

上代码

抽象工厂角色代码以下:

public interface Factory {

    // 传入参数的是产品类型,这里返回产品类的抽象工厂类Product    
    public Product factory(String productType);

}

这里作出生产雪糕、披萨的工厂,有了工厂才能生产对应的产品,具体工厂角色代码以下:

// 雪糕的工厂,负责生产雪糕
public class IceCreamFactory implements Factory {

    @Override
    public Product factory() {
        return new IceCream();
    }

}

上面看到抽象角色Product,看代码:

public interface Product {

    public void product();

}

具体角色代码以下:

public class IceCream implements Product {

    @Override
    public void product() {

        /**
         *  具体的业务逻辑
         */
        System.out.println("雪糕作好了!!");
    }

}

OK,涉及到工厂方式模式系统的代码基本完成,下面看看客户端怎么使用工厂模式,雪糕准备就绪:

public class Client {

    public static void main(String[] args){

        // 生产雪糕
        Factory iceCreamFactory = new IceCreamFactory();
        Product iceCream = iceCreamFactory.factory();
        iceCream.product();

    }

}

运行客户端代码,结果以下:

雪糕作好了!!

扩展

雪糕的order已经完成!雪糕不吃,吃披萨?OK,如今就作披萨。一样的先实现抽象工厂和抽象产品角色。

披萨工厂实现以下:

// 披萨的工厂,负责生产披萨
public class PizzaFactory implements Factory {

    @Override
    public Product factory() {
        return new Pizza();
    }

}

接下来就是披萨:

public class Pizza implements Product {

    @Override
    public void product() {
        /**
         *  具体的业务逻辑
         */
        System.out.println("披萨作好了!!");
    }

}

如今咱们在客户端中实现生产披萨,代码以下:

public class Client {

    public static void main(String[] args){

        // 生产雪糕
        Factory iceCreamFactory = new IceCreamFactory();
        Product iceCream = iceCreamFactory.factory();
        iceCream.product();

        // 生产披萨
        Factory pizzaFactory = new PizzaFactory();
        Product pizza = pizzaFactory.factory();
        pizza.product();
    }

}

运行结果以下:

雪糕作好了!!

披萨作好了!!

3、工厂方法模式的优缺点

优势

1)优秀的扩展性。假如披萨不想吃了,想吃芝士蛋糕,只须要增长芝士蛋糕的具体工厂和具体产品类,不会影响其余产品的生产。

2)大下降代码的耦合度,客户端最终获得的是产品自己,而不须要知道和操做产品的生产过程。

缺点

1)增长新产品时,须要增长具体的工厂类和具体的产品类,当产品数量多的时候就会形成系统的复杂度增大,也增长了对系统理解的难度。

4、比较

跟策略模式对比:问得最多的一个问题。工厂方法模式和策略的模式有什么区别?区别在于,策略模式强调的是提供不一样的策略方案,而工厂方法模式强调的是产品自己。

策略模式接下来也会说到,把策略模式吃透了,回头再跟工厂方法模式对比的时候就恍然大悟了。

总结

首先,上一篇的单例模式不少人都给我提了很不错的建议,也在这篇文章中改进了。工厂方式模式的使用率也很是高,掌握它对把握系统架构会有比较大的提高。下一篇要分享的是:建造者模式

设计模式Java源码GitHub下载:https://github.com/jetLee92/DesignPattern

AndroidJet的开发之路.jpg

相关文章
相关标签/搜索