版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}
工厂方法模式缺陷:添加新产品时,不仅要添加具体产品类,还要添加具体工厂类,这样会使系统中类的个数多很多,一定程度上使系统变得更复杂了,并且更多的类在编译运行时会有额外的开销;使用工厂方法的类,如果要换成另外一种产品,还是要修改实例化的具体工厂类。