设计模式 --- 抽象工厂模式

1.定义

为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定他们的具体类。

2.使用场景

一个对象族有相同的约束时可以使用抽象工厂模式。例如之前工厂方法模式的汽车组装例子,Q3、Q5、Q7都是同一个车系,但是零部件差别很大,Q3发动机是国产的而Q7是原装进口的,Q3的轮胎是普通轮胎,Q7是全尺寸越野轮胎等等。

3.简单实现

还是以汽车生产为例,Q3、Q7都是同一系列车,但是发动机、轮胎、制动系统都是不同的产品类型。

//定义轮胎的接口
interface ITire{
    void tire();
}

//定义一个普通轮胎
class NormalTire implements ITire{

    @Override
    public void tire() {
        System.out.println("普通轮胎");
    }
}

//定义一个越野轮胎
class SUVTire implements ITire{

    @Override
    public void tire() {
        System.out.println("越野轮胎");
    }
}

//定义发动机的接口
interface IEngine{
    void engine();
}

//国产发动机
class DomesticEngine implements IEngine{

    @Override
    public void engine() {
        System.out.println("国产发动机");
    }
}

//进口发动机
class ImportEngine implements IEngine{

    @Override
    public void engine() {
        System.out.println("进口发动机");
    }
}

//定义制动系统接口
interface IBrake{
    void brake();
}

//普通制动
class NormalBrake implements IBrake{

    @Override
    public void brake() {
        System.out.println("普通制动");
    }
}

//高级制动
class SeniorBrake implements IBrake{

    @Override
    public void brake() {
        System.out.println("高级制动");
    }
}

//抽象车厂
abstract class CarFactory{
    //生产轮胎
    public abstract ITire createTire();
    //生产发动机
    public abstract IEngine createEngine();
    //生产制动系统
    public abstract IBrake createBrake();
}

//生产Q3汽车
class Q3 extends CarFactory{

    @Override
    public ITire createTire() {
        //装配普通轮胎
        return new NormalTire();
    }

    @Override
    public IEngine createEngine() {
        //装配国产发动机
        return new DomesticEngine();
    }

    @Override
    public IBrake createBrake() {
        //装配普通制动系统
        return new NormalBrake();
    }
}

//生产Q7
class Q7 extends CarFactory{

    @Override
    public ITire createTire() {
        //装配越野轮胎
        return new SUVTire();
    }

    @Override
    public IEngine createEngine() {
        //进口发动机
        return new ImportEngine();
    }

    @Override
    public IBrake createBrake() {
        //高级制动系统
        return new SeniorBrake();
    }
}

public class AbsFactoryMode {
    public static void main(String[] args) {
        //构造一个Q3工厂
        Q3 q3 = new Q3();
        q3.createEngine().engine();
        q3.createTire().tire();
        q3.createBrake().brake();

        //构造Q7工厂
        Q7 q7 = new Q7();
        q7.createTire().tire();
        q7.createEngine().engine();
        q7.createBrake().brake();
    }
}

输出结果:

4.小结

优点:接口实现相分离,客户端只是面向接口编程,从具体的实现解耦。

缺点:文件类增加,不太容易拓展新产品,增加一个产品就需要修改抽象工厂,那么所有的具体工厂类均会被修改。

猜你喜欢

转载自blog.csdn.net/huxing0215/article/details/84235169