概述
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题。
那么要想尽可能少的去修改”原有的工厂类”,而达到”扩展”产品的目的,那么我们就需要更进一步的封装。说白了,就是再抽一层。那么如何来再抽一层呢?下面进行分析。
思考
引用第一篇简单工厂方法模式的案例:
枪分为冲锋枪(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