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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaorongke/article/details/82996194

1.定义

工厂方法模式又称为工厂模式、虚拟构造器模式或多态工厂模式,是简单工厂模式的延伸,该模式定义一个创建产品对象的工厂接口或抽象方法,让子类决定实例化哪一个类。

2.作用

工厂方法模式与简单工厂模式相比,区别在于工厂方法模式多了一个抽象工厂接口,每一个具体工厂实现某个具体产品的实现。

3.模式角色

  • 抽象产品:定义具体产品的公共接口;
  • 具体产品:定义要生产的具体产品,具体工厂创建的目标;
  • 抽象工厂:定义具体工厂的公共接口;
  • 具体工厂:定义具体工厂,实现抽象工厂的接口去创建产品。

4.实现方法

a. 创建抽象工厂类。

/**
 * 工厂方法模式 - 抽象工厂类, 定义具体工厂的公共接口
 *
 * @author rkyao
 * @date 2018/9/11
 */
public abstract class AbstractFactory {

    public abstract AbstractProduct manufacture();

}

b. 创建抽象产品类。

/**
 * 工厂方法模式 - 抽象产品类, 定义具体产品的公共接口
 *
 * @author rkyao
 * @date 2018/9/11
 */
public abstract class AbstractProduct {

    public abstract void show();

}

c. 创建具体工厂类。

/**
 * 工厂方法模式 - 具体工厂类, 定义创建具体产品示例的方法
 *
 * @author rkyao
 * @date 2018/9/11
 */
public class ConcreteFactoryA extends AbstractFactory {

    @Override
    public AbstractProduct manufacture() {
        return new ConcreteProductA();
    }

}

/**
 * 工厂方法模式 - 具体工厂类, 定义创建具体产品示例的方法
 *
 * @author rkyao
 * @date 2018/9/11
 */
public class ConcreteFactoryB extends AbstractFactory {

    @Override
    public AbstractProduct manufacture() {
        return new ConcreteProductB();
    }

}

d. 创建具体产品类。

/**
 * 工厂方法模式 - 具体产品类, 定义生产的具体产品
 *
 * @author rkyao
 * @date 2018/9/11
 */
public class ConcreteProductA extends AbstractProduct {

    @Override
    public void show() {
        System.out.println("具体产品类A, 生产出了产品A");
    }

}

/**
 * 工厂方法模式 - 具体产品类, 定义生产的具体产品
 *
 * @author rkyao
 * @date 2018/9/11
 */
public class ConcreteProductB extends AbstractProduct {

    @Override
    public void show() {
        System.out.println("具体产品类B, 生产出了产品B");
    }

}

工厂方法模式通过上面a、b、c、d四步已实现完成,下面演示一下如何使用:

/**
 * 工厂方法模式 - 测试类
 *
 * @author rkyao
 * @date 2018/9/11
 */
public class FactoryTest {

    public static void main(String[] args) {
        // 客户要产品A
        ConcreteFactoryA factoryA = new ConcreteFactoryA();
        factoryA.manufacture().show();

        // 客户要产品B
        ConcreteFactoryB factoryB = new ConcreteFactoryB();
        factoryB.manufacture().show();
    }

}

工厂方法模式缺陷:添加新产品时,不仅要添加具体产品类,还要添加具体工厂类,这样会使系统中类的个数多很多,一定程度上使系统变得更复杂了,并且更多的类在编译运行时会有额外的开销;使用工厂方法的类,如果要换成另外一种产品,还是要修改实例化的具体工厂类。

猜你喜欢

转载自blog.csdn.net/yaorongke/article/details/82996194