Android源码设计模式学习笔记-抽象工厂方法模式

2018-01-07  本文已影响1人  e小e

从一个栗子开始,现在两种产品一个是普通轮胎,一个是越野轮胎,然后生产这两种产品,用工厂模式去实现是

public interface ITire {
    void tire();
}
public class NormalTire implements ITire{
    @Override
    public void tire() {
        System.out.println("普通轮胎");
    }
}
public class SUVTire implements ITire{
    @Override
    public void tire() {
        System.out.println("越野轮胎");
    }
}
public class FactoryTire {
    public static <T extends ITire> T createTire(Class<T> clz){
        ITire tire = null;
        try {
            tire = (ITire) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) tire;
    }
}

但是现在需求变了,我不生产轮胎要生产汽车了,那么汽车包含的零件就多了,绝不仅仅限于轮胎,而且汽车的款式也多,这么一个复杂的生产关系,我们就要用到抽象工厂设计模式了. 在这个时候抽象的工厂是汽车生产工厂,注意它不像简单工厂模式那样,仅仅局限于一种特定的产品去生产,所以我们这里还需要对工厂抽象。
先来看一张抽象工厂的uml.


image.png

目前需求是生产Q7和Q3汽车,那么需要引擎和轮胎两种零件,uml可以看成是


image.png
实际代码
public interface ITire {
    void tire();
}
public class NormalTire implements ITire{
    @Override
    public void tire() {
        System.out.println("普通轮胎");
    }
}
public class SUVTire implements ITire{
    @Override
    public void tire() {
        System.out.println("越野轮胎");
    }
}
public interface IEngine {
    void engine();
}
public class ImportEngine implements IEngine{
    @Override
    public void engine() {
        System.out.println("进口发动机");
    }
}
public class DemesticEngine implements IEngine{
    @Override
    public void engine() {
        System.out.println("国产发动机");
    }
}
public interface CarFactory {
    ITire createTire();
    IEngine createEngine();
}
public class Q3Factory implements CarFactory{
    @Override
    public ITire createTire() {
        return new NormalTire();
    }

    @Override
    public IEngine createEngine() {
        return new DemesticEngine();
    }
}
public class Q7Factory implements CarFactory{
    @Override
    public ITire createTire() {
        return new SUVTire();
    }

    @Override
    public IEngine createEngine() {
        return new ImportEngine();
    }
}

最后调用

        Q3Factory q3Factory = new Q3Factory();
        q3Factory.createEngine().engine();
        q3Factory.createTire().tire();

        Q7Factory q7Factory = new Q7Factory();
        q7Factory.createEngine().engine();
        q7Factory.createTire().tire();

输出

01-07 22:14:38.730 9413-9413/? I/System.out: 国产发动机
01-07 22:14:38.731 9413-9413/? I/System.out: 普通轮胎
01-07 22:14:38.732 9413-9413/? I/System.out: 进口发动机
01-07 22:14:38.732 9413-9413/? I/System.out: 越野轮胎
上一篇下一篇

猜你喜欢

热点阅读