zoukankan      html  css  js  c++  java
  • 设计模式(3)----工厂方法模式

    1. 前言:
      1. 之前写过简单工厂模式,在简单工厂的引入中,我们将实例化具体对象的工作交给了专门负者创建对象的工厂类中,这样当客户需求什么产品的车既可以生成对应的车了,但是,客户的需求多样化,为了满足客户的需求就需要修改源代码,这样并不是合理的方式,所以引入工厂方法模式来解决这个问题。
    2. 定义:
      1. 工厂方法模式(Factory Method)又称多态性工厂模式。在工厂方法模式中,定义工厂父类创建对象的公共接口,子类负责生成具体的对象。也就是具体的工厂对象负责生产具体的产品对象。
    3. 工厂方法模式的UML图。

    4. 组成:
      1. 核心结构有四个部分:
        1. 抽象工厂,具体产品的父类
        2. 具体工厂,抽象产品的子类
        3. 抽象产品,具体工厂的父类
        4. 具体产品,抽象工厂的子类
    5. 实例背景
      1. 一个小型汽车工厂,客户需求A类汽车和B类汽车,汽车生产工厂需要生产这两种类型的汽车,用工厂方法模式;来实现。
    6. 步骤:
      1. 创建抽象工厂类,定义具体工厂的公共接口

    package com.lvsling.factorymethod;

    /**

    * 抽象工厂角色,声明了工厂方法

    * @author Administrator

    *

    */

    public interface Factory {

        public Car produceCar();

    }

     

    1. 创建抽象产品类,定义具体产品的公共接口

    package com.lvsling.factorymethod;

    /**

    * 抽象产品角色:Car

    * @author Administrator

    *

    */

    public abstract class Car {

    }

     

    1. 创建具体产品类,定义生产的具体产品

    package com.lvsling.factorymethod;

    /**

    * 具体产品角色:CarA

    * @author Administrator

    *

    */

    public class CarA extends Car {

        public CarA() {

            System.out.println("生产了一辆A型车!");

        }

    }

     

    package com.lvsling.factorymethod;

    /**

    * 具体产品角色:CarB

    * @author Administrator

    *

    */

    public class CarB extends Car {

        public CarB() {

            System.out.println("生产了一辆B型车!");

        }

    }

     

    1. 创建具体工厂类,定义创建对应具体产品实例的方法

    package com.lvsling.factorymethod;

    /**

    * 具体工厂角色:CarA,生产A型汽车

    * @author Administrator

    *

    */

    public class FactoryA implements Factory {

        public FactoryA() {

            System.out.println("生产A型汽车的工厂正在生产:");

        }

        @Override

        public CarA produceCar() {

            return new CarA();

        }

    }

     

    package com.lvsling.factorymethod;

    /**

    * 具体工厂角色:CarB,生产B型汽车

    * @author Administrator

    *

    */

    public class FactoryB implements Factory {

        public FactoryB() {

            System.out.println("生产B型汽车的工厂正在生产:");

        }

        @Override

        public CarB produceCar() {

            return new CarB();

        }

    }

     

    1. 创建一个client来调用具体工厂类的方法

    package com.lvsling.factorymethod;

    public class Client {

        public static void main(String[] args) {

            Factory factoryA = new FactoryA();         // 创建生产A型汽车的工厂

            Car carA = factoryA.produceCar();         // 生产A型汽车

            Factory factoryB = new FactoryB();         // 创建生产B型汽车的工厂

            Car carB = factoryB.produceCar();         // 生产B型汽车

        }

    }

     

    1. 控制台打印结果

    生产A型汽车的工厂正在生产:

    生产了一辆A型车!

    生产B型汽车的工厂正在生产:

    生产了一辆B型车!

     

    1. 优点:
      1. 子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现,增加了灵活性
      2. 多态性:客户代码可以做到与特定应用无关,适用于任何实体类。
      3. 扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可"拥抱变化"。
      4. 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
      5. 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
      6. 良好的封装性,代码结构清晰
    2. 缺点:
      1. 需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。
    3. 应用场景:
      1. 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度
      2. 工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度
      3. 由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。
    4. 总结
      1. 主要说明了工厂方法模式使用方法,其实,工厂方法模式就是简单工厂模式的衍生,解决了许多简单工厂模式的问题,首先完全实现了"开-闭原则",实现了可扩展性,其次更复杂的层次结构,可以应用于产品结果复杂的场合。
  • 相关阅读:
    hdu-1142(记忆化搜索+dij)
    hdu-1140(求距离,精度判断)
    hdu-1131(卡特兰数+大数)
    hdu-1130(卡特兰数+大数乘法,除法模板)
    hdu-1129(模拟题)
    hdu-1128(数学问题,筛数)
    hdu-1124(数学问题,求n!的尾零的个数)
    hdu-1115(计算多边形重心)
    hdu-1121(差分法--数学问题)
    表达式求值(堆栈)
  • 原文地址:https://www.cnblogs.com/lvsling/p/8469848.html
Copyright © 2011-2022 走看看