设计模式—创建型—抽象工厂模式

概述

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题。

那么要想尽可能少的去修改”原有的工厂类”,而达到”扩展”产品的目的,那么我们就需要更进一步的封装。说白了,就是再抽一层。那么如何来再抽一层呢?下面进行分析。

思考

引用第一篇简单工厂方法模式的案例:

枪分为冲锋枪(MP5/UZI/MK5),步枪(M4a1/AK47/),手枪(p9/沙漠之鹰),狙击枪(AWP/AWM)

  • 抽象工厂,我们就把工厂也进行抽象了,把之前的那个GunFactory进行抽象。那么我们定义一个接口叫做:IGunFactory.java。然后里边定义1个接口方法:produceGun()

  • 然后定义它的扩展类【产品族】:
    RifleFactory,SubmachineFactory

  • 然后再针对这俩个产品族工厂编写实现类:
    AK47Factory,MP5Factory

  • 编写测试类

代码实践

抽象工厂

public interface IGunFactory {

     void produceGun();

}

然后定义它的扩展类【产品族】

public abstract class RifleFactory implements IGunFactory{

    @Override
    public void produceGun() {
        produceRifleGun();
    }

    public abstract void produceRifleGun();

}
public abstract class SubmachineFactory implements IGunFactory{

    @Override
    public void produceGun() {
        produceSubmachineGun();
    }

    public abstract void produceSubmachineGun();

}

然后再针对这俩个产品族工厂编写实现类

public class AK47Factory extends RifleFactory {

    @Override
    public void produceRifleGun() {
        new AK47();
    }
}
public class MP5Factory extends SubmachineFactory {

    @Override
    public void produceSubmachineGun() {
        new MP5();
    }
}

编写测试类

public class AbsFactoryTest {
    public static void main(String [] args){

        System.out.println("设计模式:抽象工厂模式");
        IGunFactory igf1 = new AK47Factory();
        igf1.produceGun();
        IGunFactory igf2 = new MP5Factory();
        igf2.produceGun();
    }

}

输出结果:

设计模式:抽象工厂模式
类型:步枪
名称:AK47
类型:冲锋枪
名称:MP5

优势体现

假设现在我们新来一个需求,要求扩充一个产品族(狙击枪),我们这时候就不必再像之前那样,对原有的代码进行修改,而是新启一个产品族即可。

步骤梳理

  • 新增产品AWM,AWP
  • 新增抽象工厂:SniperFactory
  • 实现SniperFactory,AWMFactory,AWPFactory
  • 编写测试代码

代码实践

public class AWPFactory extends SniperFactory {

    @Override
    public void produceSniperGun() {
        new AWP();
    }

}
public class AWMFactory extends SniperFactory {

    @Override
    public void produceSniperGun() {
        new AWM();
    }


}
        IGunFactory igf3 = new AWMFactory();
        igf3.produceGun();
        IGunFactory igf4 = new AWPFactory();
        igf4.produceGun();

输出

设计模式:抽象工厂模式
类型:步枪
名称:AK47
类型:冲锋枪
名称:MP5
类型:狙击枪
名称:AWM
类型:狙击枪
名称:AWP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值