设计模式之工厂方法模式(FactoryMethod Pattern)
相关定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
工厂方法的实现主要是通过以下步骤:
- 创建一个抽象工厂,里面定义一个抽象方法;
- 创建具体工厂继承抽象工厂(如过抽象工厂是接口则实例化,下面例子使用的是抽象类、方法)实现父类的(上级接口的)方法;
- 创建抽象产品接口,里面定义一个方法
- 创建具体产品实现抽象产品接口,实现上级方法
适用场景:
1、当一个类不知道它所必须创建的对象的类的时候;
2、当一个类希望由它的子类来指定它所创建的对象的时候;
3、当类将创建对象的职责委托给多个帮忙子类的中的某一个,并且你希望将哪一个帮助子类是代理者者一信息局部化时。
优点:
- 可扩展添加一个产品不用修改原来的代码,添加一个产品的实现类和一个工厂的实现类即可(开闭原则)。
- 隔离性,客户端只知道工厂就行,不需要知道创建产品的细节,实现系统解耦(单一原则)
- 为整个系统提供一个全局访问点。
缺点:
-
不适用于变化频繁的对象;
-
滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
-
如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
实现的方式
/**
* @author :高铭
* @date :Created in 2020/10/9 22:32
*/
public class FactoryMethod {
public static void main(String[] args) {
FactoryMethodA fma = new FactoryA();
Prodcut pa = fma.creatProdcut();
pa.getA();
}
}
/**
* 抽象产品
*/
interface Prodcut{
void getA();
}
/**
*具体产品
*/
class ProdcutA implements Prodcut{
@Override
public void getA() {
System.out.println("生产了A产品");
}
}
/**
* 抽象工厂
*/
abstract class FactoryMethodA{
abstract Prodcut creatProdcut();
}
/**
* 具体工厂
*/
class FactoryA extends FactoryMethodA{
@Override
Prodcut creatProdcut() {
return new ProdcutA();
}
}