设计模式之工厂方法模式

工厂方法

Posted by Simon on October 22, 2018

定义一个用于创建对象的接口,让子类决定实例化哪个类。

Activity的onCreate方法相当于工厂方法

使用场景

① 需要创建复杂对象时。

代码实现

实现的几个角色:
1.AbstractFactory抽象工厂类
2.TruckFactory具体工厂类
3.AbstractCar抽象产品类
4.Truck具体的产品类
简单实现:
① AbstractFactory

public abstract class AbstractFactory {

    public abstract <T extends AbstractCar> T createCar(Class<T> clz);

}

② AbstractCar

public abstract class AbstractCar {

    abstract void start();

}

③ Truck

public class Truck extends AbstractCar {

    @Override
    void start() {
        System.out.print("货车启动了");
    }

}

④ Bus

public class Bus extends AbstractCar {
    @Override
    void start() {
        System.out.print("客车启动了");
    }
}

⑤ TruckFactory

public class TruckFactory extends AbstractFactory {

    @Override
    public <T extends AbstractCar> T createCar(Class<T> clz) {
        AbstractCar abstractCar = null;
        try {
            abstractCar = (AbstractCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) abstractCar;
    }
}

⑥ 测试输出

public class Client {

    public static void main(String[] args){
        AbstractFactory factory = new TruckFactory();
        AbstractCar abstractCar = factory.createCar(Truck.class);
        abstractCar.start();
        AbstractCar abstractCar2 = factory.createCar(Bus.class);
        abstractCar2.start();
    }
    
}

简单实现(静态工厂模式)

当只有一个工厂时

public class StaticFactory {
    
    public static <T extends AbstractCar> T createCar(Class<T> clz){
        AbstractCar car = null;
        try {
            car = (AbstractCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }
    
}

优缺点

① 结合反射、泛型、继承抽象达到简洁、动态
【缺点】在添加新的产品时,需要编写新的产品类以及引入抽象层,会导致类结构复杂化。