工厂方法模式

一、(通用)工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,其使一个类的实例化延迟到子类。工厂方法模式的通用类图和代码如下:

工厂方法模式_第1张图片

  • AbstractFactory.javaConcreteFactory.java
public abstract class AbstractFactory {
    public abstract  T createProduct(Class cls);
}

public class ConcreteFactory extends AbstractFactory {
    @Override
    public  T createProduct(Class cls) {
        AbstractProduct product=null;
        try{
            product=(AbstractProduct)Class.forName(cls.getName()).newInstance();
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return (T)product;
    }
}
  • AbstractProduct.javaProductA.javaProductB.java
public abstract class AbstractProduct {
    public abstract void method();
}

public class ProductA extends AbstractProduct {
    @Override
    public void method() {
        System.out.println("ProductA");
    }
}

public class ProductB extends AbstractProduct {
    @Override
    public void method() {
        System.out.println("ProductB");
    }
}
  • Client.java,场景类
public class Client {
    public static void main(String[] args){
        AbstractFactory factory=new ConcreteFactory();
        AbstractProduct productA=factory.createProduct(ProductA.class);
        productA.method();

        AbstractProduct productB=factory.createProduct(ProductB.class);
        productB.method();
    }
}

  以上类图和示例代码为通用工厂方法模式,看起来并不常用。工厂方法模式有诸多扩展模式,接下来将会分别介绍,那里才是工厂方法模式大挥拳脚之地。下面首先说明一下工厂方法模式的应用场景和优点:

1. 工厂方法模式应用场景:

  • 需要灵活的、可扩展的对象生成框架;
  • 避免对象之间耦合。

2. 工厂方法模式的优点:

  • 封装良好、结构清晰,用户无需知晓对象生成的过程,尤其适用于复杂对象的生成过程;
  • 扩展性极好,无需改动而只需增加产品类即可完成扩展;
  • 屏蔽产品类的细节,只关心抽象产品的接口约束,降低耦合。

下面为工厂方法模式的几个扩展:

二、 简单工厂方法模式

  仅需要一个工厂类,不需要抽象的工厂基类,类图如下:

工厂方法模式_第2张图片


三、 每个具体产品类对应一个具体工厂类的工厂方法模式

   每个具体产品类对应一个具体工厂类,这在每个具体产品类的对象生成都很复杂或者各产品初始化机制不同的情况下特别有用,下面分别是类图和框架代码:

工厂方法模式_第3张图片

  • AbstractFactory.javaFactoryA.javaFactoryB.java
public abstract class AbstractFactory {
    public abstract AbstractProduct createProduct();
}

public class FactoryA extends AbstractFactory {
    @Override
    public AbstractProduct createProduct() {
        return new ProductA();
    }
}

public class FactoryB extends AbstractFactory {
    @Override
    public AbstractProduct createProduct() {
        return new ProductB();
    }
}
  • AbstractProduct.javaProductA.javaProductB.java
public abstract class AbstractProduct {
    public abstract void method();
}

public class ProductA extends AbstractProduct {
    @Override
    public void method() {
        System.out.println("ProductA");
    }
}

public class ProductB extends AbstractProduct {
    @Override
    public void method() {
        System.out.println("ProductB");
    }
}
  • Client.java,场景类
public class Client {
    public static void main(String[] args){
        AbstractFactory factoryA=new FactoryA();
        AbstractProduct productA=factoryA.createProduct();
        productA.method();

        AbstractFactory factoryB=new FactoryB();
        AbstractProduct productB=factoryA.createProduct();
        productB.method();
    }
}

  这种工厂方法模式各个工厂的职责清晰,但是增加了扩展的复杂度,因为每扩展一个产品类就要扩展一个相应的工厂类。

你可能感兴趣的:(设计模式)