Android设计模式2--工厂方法模式

1. 定义

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

Android设计模式2--工厂方法模式

2. 使用场景

  • 复杂对象的生成,代替new的方式来屏蔽产品类的创建过程:需要一种产品,而不想知道也不需要知道工厂是如何生产出来的,只需要知道具体对应的工厂就行。
  • 产品的替换需要灵活、可扩展性高的场合。
  • 测试驱动开发的框架中,往往通过工厂方法把对象虚拟出来(用得比较少)。
  • Android中的Bitmap就是通过工厂方法来创建的。

 

3. 实现

工厂方法模式主要通过定义角色来实现,角色主要分为四大模块:一是抽象工厂,其为工厂方法模式的核心;二是具体工厂,其实现了具体的业务逻辑;三是抽象产品,其是工厂方法模式创建产品的父类;四是具体产品,其为实现抽象产品的某个具体产品的对象。代码实现如下:

3.1 抽象产品类:

/**
 * Created by LJW on 2019/3/13.
 * 抽象产品类
 * 规划产品的属性
 */
public abstract class AudiCar {

    public abstract void drive();

    public abstract void selfNavigation();
}

3.2 具体产品类:

/**
 * Created by LJW on 2019/3/13.
 * 具体产品类
 */
public class AudiQ5 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("AudiQ5 启动啦");
    }

    @Override
    public void selfNavigation() {
        System.out.println("AudiQ5 自动巡航啦");
    }
}
/**
 * Created by LJW on 2019/3/13.
 * 具体产品类
 */
public class AudiQ7 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("AudiQ7 启动啦");
    }

    @Override
    public void selfNavigation() {
        System.out.println("AudiQ7 自动巡航啦");
    }
}

3.3 抽象工厂类:

/**
 * Created by LJW on 2019/3/13.
 * 抽象工厂类
 * 通过泛型来达到生产不同产品的目的
 * 满足迪米特原则——解耦
 */
public abstract class AudiFactory {

    public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}

3.4 具体工厂类:

/**
 * Created by LJW on 2019/3/13.
 * 具体工厂类
 * 通过反射,实例化具体的产品
 */
public class AudiCarFactory extends AudiFactory {
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar audiCar = null;
        try {
            audiCar = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) audiCar;
    }
}

3.5 场景类:

/**
 * Created by LJW on 2019/3/13.
 */
public class FactoryTest {

    public static void main(String[] args) {
        AudiFactory factory = new AudiCarFactory();

        AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
        audiQ5.drive();
        audiQ5.selfNavigation();

        AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
        audiQ7.drive();
        audiQ7.selfNavigation();
    }
}

3.6 执行结果:

AudiQ5 启动啦
AudiQ5 自动巡航啦

AudiQ7 启动啦
AudiQ7 自动巡航啦

4. 优点

  • 良好的封装性与解偶。利用工厂的工厂方法类去创建具体的产品对象,隐藏了具体产品对象的创建细节,只需要关心具体产品对应的具体工厂。高层模块只需要关心抽象产品类。
  • 遵守开闭原则,扩展性好。加入新的产品类时,只需要同时加入工厂类就可以实现扩展,无需修改原来的代码。

 

5. 缺点

  • 随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护,增加系统编译和运行的开销。