抽象工厂模式

工厂模式(二) 抽象工厂模式

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

抽象工厂模式的类繁多分为4类:
(1)抽象工厂角色  他声明了一组用于创建一种产品的方法,每一个方法对应一种产品。
(2) 具体工厂角色  他实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品这些产品构成一个产品种类
(3) 抽象产品角色  他为每种产品声明接口
(4) 具体产品角色  他定义具体工厂生产的具体产品对象实现抽象产品中声明的业务方法


下面来一个抽象工厂模式的简单实现

//先把抽象产品类写出来

public interface IBrake {
    void brake();
}   

public interface IEngine {
    void engine();
}

public interface ITire {
    void tire();
}

//抽象工厂类

public abstract class CarFactory {

    public abstract ITire creatTire();

    public abstract IEngine createEngine();

    public abstract IBrake createBrake();
}

//具体产品类 有点多

public class SUVTire implements ITire {
    @Override
    public void tire() {
        System.out.println("我是SUV轮胎");
    }
}

public class NormalTire implements ITire {
    @Override
    public void tire() {
        System.out.println("我是正常轮胎");
    }
}

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

public class NormalBrake implements IBrake {
    @Override
    public void brake() {
        System.out.println("我是普通刹车系统");
    }
}

public class DomestEngine implements IEngine {
    @Override
    public void engine() {
        System.out.println("我是国产发动机");
    }
}

public class ImportEngine implements IEngine {
@Override
    public void engine() {
        System.out.println("我是进口发动机");
    }
}

//Q3工厂类

public class Q3Factory extends CarFactory {
    @Override
    public ITire creatTire() {
        return new NormalTire();
    }

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

    @Override
    public IBrake createBrake() {
        return new NormalBrake();
    }
}   

//Q7工厂类

public class Q7Factory extends CarFactory {
    @Override
    public ITire creatTire() {
        return new SUVTire();
    }

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

    @Override
    public IBrake createBrake() {
        return new SeniorBrake();
    }
}

//客户端实现

public class Client {
    public static void main(String[] args){
        CarFactory carQ3 = new Q3Factory();
        carQ3.createBrake().brake();
        carQ3.createEngine().engine();
        carQ3.creatTire().tire();

        CarFactory carQ7 = new Q7Factory();
        carQ7.createBrake().brake();
        carQ7.createEngine().engine();
        carQ7.creatTire().tire();
    }
}

代码中可以看出来 Q3和Q7使用的零件是不相同的。
我们只是模拟了Q3Q7的生产工厂要是再加一个Q5呢 那么我们对应的轮胎  发动机  刹车系统又要增加  这里
可以看出抽象工厂模式的一个弊端,就是类的陡增,如果工厂类过多 势必会导致文件非常多  多以在开发中一定要权衡利弊使用

总结一下  
抽象工厂模式的优点:
    一个显著的优点是分离接口与实现。客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体实现是谁
    客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦。同时基于接口与实现的分离,使用抽象工厂模式在切换
    产品类时更加灵活、容易
抽象工厂模式的缺点:
    上面我们也说了,一是对类文件的爆炸性增加,二是不太容易扩展新的产品类,因为我们增加一个产品类就需要修改抽象工厂
    那么所有的具体工厂都要被修改。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值