概要
设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。
定义
为创建一组相关或者相互依赖的对象,提供一个接口,但是不需要指定他们的具体类
使用场景
一组对象具有相同的约束条件的可以使用抽象工厂模式,是不是有点感觉好模糊,有点抽象?简单的来讲,就是两种产品,具有不同的特性
比如:
1.市场上的白加黑,虽然都能治疗感冒,由不同的商家产出,成分肯定不同,特性效果肯定不一样
2.比如奥迪汽车,有q3,q5,等,虽然都是奥迪,但是可能制动系统,发动机等可能就不一样,有些高配,有些低配,带天窗和不带天窗等等
那这个抽象工厂模式和前面的工厂方法模式有什么区别呢,我们接下去往下看
UML
在这里看到这个类图,然后可能就 what is fuck!什么东西,这么多,但是其实并不复杂
在这之前,我很少过多解释类图之间的关系,详细的说明等,说真的,前面的几种设计模式非常的简单,所以,我直接都是代码表示
这篇我会多做些解释,其实并没有这么复杂,大家往下看
(1)抽象工厂
抽象工厂:这个抽象工厂其实很简单,你可以这样想,我这个工厂可以制造很多种汽车,可以发明改造的各种汽车,生产新品
(2)抽象1工厂
抽象1工厂:第一个抽象工厂继承抽象工厂,大家可以理解为,我这个工厂学习继承了抽象工厂的方法,我也会造汽车了,但是我在这个基础的理念上,进行了改造,所以有了奥迪汽车,然后时间日结月累,我会制造q3,q5,a4,a4L,a6,a7,a8等等系列的奥迪车
同上:我还能在这基础上发明,宝马:320,x1,x3,x5等等
(3)抽象2工厂
抽象2工厂:第二个抽象工厂跟抽象1工厂类似
(4)抽象产品1
抽象产品:抽象产品,也就是我们的汽车,拥有一般汽车的共性,比如:能开,能跑,能放音乐等
(5)具体产品
具体产品:具体产品,那就是实际生产的了,比如,一系列的车,对吧,可能刚开始的车,只能跑
1.第一代车(敞篷车)拖拉机吧,哈哈
2.第二代车:有玻璃门和天窗
3.第三代车:有内外反光镜
4.第四代车:能放音乐导航
…
..
.
这也就是所谓的多种系列,当然以上纯属举例,切勿当真
以上对类图UML做了详细的解释,相信这样大家理解起来,应该非常简单吧
代码演示
上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:
我们都知道,其实汽车厂,制造汽车没这么简单,说造好就造好了,汽车厂,肯定会制造一些列的东西,然后在组装,比如:
1.轮子
2.发动机
3.外壳
4.反光镜
…
…
.
(1)抽象车工厂
package com.zengtao.demo.absfactory;
/**
* 抽象车工厂
*/
public abstract class AbstractFactory {
public abstract ITire tireType();
public abstract IEngine engineType();
public abstract void create();
}
(2)具体工厂奥迪Q3
package com.zengtao.demo.absfactory;
/**
* 奥迪q3工厂
*/
public class AudiQ3Factory extends AbstractFactory {
@Override
public ITire tireType() {
return new SkidTire();
}
@Override
public IEngine engineType() {
return new NormalEngine();
}
@Override
public void create() {
System.out.println("奥迪Q3已生产!");
}
}
(3)具体工厂奥迪Q7
package com.zengtao.demo.absfactory;
/**
* 奥迪q7工厂
*/
public class AudiQ7Factory extends AbstractFactory {
@Override
public ITire tireType() {
return new PlainTire();
}
@Override
public IEngine engineType() {
return new HeightEngine();
}
@Override
public void create() {
System.out.println("奥迪Q7已生产!");
}
}
(4)抽象轮胎
package com.zengtao.demo.absfactory;
/**
* 抽象轮胎
*/
public interface ITire {
void tireType();
}
(5)具体轮胎
5.1 防滑轮胎
package com.zengtao.demo.absfactory;
/**
* 防滑轮胎
*/
public class SkidTire implements ITire {
@Override
public void tireType() {
System.out.println("防滑轮胎,雨天专备");
}
}
5.2 越野轮胎
package com.zengtao.demo.absfactory;
/**
* 越野轮胎
*/
public class PlainTire implements ITire {
@Override
public void tireType() {
System.out.println("越野轮胎,旅途专备");
}
}
(6)抽象发动机
package com.zengtao.demo.absfactory;
/**
* 抽象发动机
*/
public interface IEngine {
void engineType();
}
(7)具体发动机
7.1 普通发动机
package com.zengtao.demo.absfactory;
/**
* 普通发动机
*/
public class NormalEngine implements IEngine {
@Override
public void engineType() {
System.out.println("国产,普通发动机");
}
}
7.2 德国进口发动机
package com.zengtao.demo.absfactory;
/**
* 高配置发动机
*/
public class HeightEngine implements IEngine {
@Override
public void engineType() {
System.out.println("德国进口,高配置发动机");
}
}
(8)调用
package com.zengtao.demo;
import com.zengtao.demo.absfactory.AudiQ3Factory;
import com.zengtao.demo.absfactory.AudiQ7Factory;
public class Main {
public static void main(String[] str) {
AudiQ3Factory audiQ3Factory = new AudiQ3Factory();
audiQ3Factory.engineType().engineType();
audiQ3Factory.tireType().tireType();
audiQ3Factory.create();
System.out.println();
AudiQ7Factory audiQ7Factory = new AudiQ7Factory();
audiQ7Factory.engineType().engineType();
audiQ7Factory.tireType().tireType();;
audiQ7Factory.create();
}
}
(9)结果
ok,到这里,我们就将抽象工厂模式用简单的例子给展现了出来,仔细的看下来,其实也就是那这样了,但是不难看出,该设计模式,有很大的问题,不知道各位同学发现没有,那就是每当我们对于的发动机有新款,轮胎有新款,又要重新创建n多类,导致类不停的增多,当真是可怕。。。
总结
当然,每一种设计模式既然存在,就有存在的道理,但是该何时采用,却需要谨慎考虑,解析来总结下抽象工厂模式的优缺点
优点
明显的优点就是,分离了接口和实现,该方法中,返回的是接口,如ITired,面向的是接口编程,具体实现到具体类去做处理,切换产品类时,比较灵活
缺点
缺点也很明显,就是会导致类不停的爆增,第二个是扩展新的产品类,新增的话抽象工厂修改,然后一路修改下来,工作量非常大,一增全改,然后就发现要爆炸了。。。
当然抽象工厂模式在Android中的使用,大家可以去看看,你继承Service 服务的时候,会复写onBind方法,也是面向IBinder接口的吧,如果想了解更多,可以具体去看看
郑重申明:使用设计模式的时候,需要谨慎,有些时候,直接的编码,或许也能更直观的表明和实现,反之有些时候,设计模式,能完美优雅的解决问题