抽象工厂模式

一.背景

抽象工厂意味着生产出来的产品是不确定的,抽象工厂模式起源于以前对不同操作系统的图形化解决方案。

 

二.抽象工厂模式的定义

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

 

三.抽象工厂模式的使用场景(还是没看懂

例子:Android,ios,Window,Phone下都有短信软件,拨号软件,两者都属于Software软件的范畴,但是他们所在的操作系统的平台不一样,即便是同一家公司出品的软件,其代码的实现逻辑也是不同的,这时候就可以考虑使用抽象工厂方法模式来生产Androidios,Window Phone下的短信软件和拨号软件

 

四.抽象工厂模式简单实现

Q3,Q5,Q7,可能轮胎发动机不一样,所以不可能是一条生长线出来的



抽象轮胎

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 DomesticEngine implements IEngine {
        @Override
        public void engine() {
            System.out.println("国产发动机");
        }
    }

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


抽象刹车

public interface IBrake {
    /**
     * 轮胎
     */
    void brake();

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

    public class SeniorBrake implements IBrake {
        @Override
        public void brake() {
            System.out.println("只能刹车");
        }
    }
}

抽象工厂

public abstract class CarFactory {
    /**
     * 生产轮胎
     *
     * @return 轮胎
     */
    public abstract ITire createTire();

    /**
     * 生产发动机
     *
     * @return 发动机
     */
    public abstract IEngine createEngine();

    /**
     * 生产制动系统
     *
     * @return 制动系统
     */
    public abstract IBrake createBrake();
}


生产Q3的工厂

public class Q3Factory extends CarFactory {

    @Override
    public ITire createTire() {
        return new NormalTire();
    }

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

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

生产Q7的工厂

public class Q7Factory extends CarFactory {

    @Override
    public ITire createTire() {
        return new SUVTire();
    }

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

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


生产Q5的工厂

public class Client {
    public static void main(String[] args) {
        //构造一个生产Q3的工厂
        CarFactory factoryQ3 = new Q3Factory();
        factoryQ3.createTire().tire();
        factoryQ3.createEngine().engine();
        factoryQ3.createBrake().brake();

        System.out.println("-----------------------------------");
        //构造一个生产Q5的工厂
        CarFactory factoryQ5 = new Q5Factory();
        factoryQ5.createTire().tire();
        factoryQ5.createEngine().engine();
        factoryQ5.createBrake().brake();
    }





缺点:

 

上面只是模拟了Q3Q7的工厂,如果此时我们需要增加Q5的工厂呢?对应的轮胎,制动系统和发动机类又要增加,这里就可以看出抽象工厂方法模式的一个弊端,就是类的陡增,如果工厂类过多,势必导致类文件非常多,因此在实际开发过程一定要权衡慎用

 

 

总结:

抽象工厂方法模式的优点:

一个显著的优点是分离接口与实现,客户端只是面向产品的接口编程而已,使切换产品类时更加灵活,容易

 

抽象工厂方法模式的缺点:

(1).类文件的爆炸性增加

(2)是不太容易扩展新的产品类,因为每当我们增加一个产品类就需要修改抽象工厂,那么所有的具体工厂类均会被修改




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值