版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YQYnsmile/article/details/82969362
上篇博文我简介的介绍了下工厂模式,不知道是不是帮助到了部分人,下面我们再来探讨下抽象工厂模式。
某一天,唐三藏一行人西行的路上遇到了一个强大无比的妖怪,唐僧被抓走了,光靠悟空他们没有办法把唐僧救回来,这个时候就需要找救兵了。悟空他们第一时间想到的就是天庭,但是奈何现在没有这个工厂啊,怎么办?所以得按照原来的套路,再建多一个第三方工厂来解决第三方帮手的问题。还是先从图了解下先:
(1)工厂模式时候的图(上一篇博文)
(2)现在我们需要增加一个第三方工厂
现在我们就有两个工厂了,遇到妖怪时,那一个打的过,我们就用哪个,实在不行就一起上,毕竟团结就是力量吗。哈哈哈!!
然后我们通过代码来看下:
(1)第一步:仍旧是上一篇的帮手:
* 帮手的接口
* */
public interface Bangshou {
/**
* 用来说明是谁
* */
void whoAmI();
}
public class WuKong implements Bangshou{
@Override
public void whoAmI() {
System.out.println("我是齐天大圣孙悟空!");
}
}
(2)第二步:第三方帮手
public interface Thirdbangshou {
void whoHelper();
}
public class Erlangshen implements Thirdbangshou{
@Override
public void whoHelper() {
System.out.println("我是二郎神!来参战");
}
}
(3)第三步:第三步,定义一个工厂,这个工厂不仅仅可以生产帮手,还可以生成第三方帮手(抽象)
public abstract class AbstractHelperFactory {
public abstract Bangshou getBanshou(String who);
public abstract Thirdbangshou getThirdbangshou(String who);
}
(4)第四步,实现这个工厂,推迟到它的子类实现,第一个仅仅是实现帮手的
public class NewBangshouFactory extends AbstractHelperFactory{
@Override
public Bangshou getBanshou(String who) {
if(who == null) return null;
if("WUKONG".equalsIgnoreCase(who)) {
return new WuKong();
}
if("BAJIE".equalsIgnoreCase(who)) {
return new Bajie();
}
if("BAILONGMA".equalsIgnoreCase(who)) {
return new Bailongma();
}
if("SHASENG".equalsIgnoreCase(who)) {
return new Shaseng();
}
return null;
}
@Override
public Thirdbangshou getThirdbangshou(String who) {
return null;
}
}
(5)实现第三方帮手接口
public class ThirdbangshouFactory extends AbstractHelperFactory{
@Override
public Bangshou getBanshou(String who) {
// TODO Auto-generated method stub
return null;
}
@Override
public Thirdbangshou getThirdbangshou(String who) {
if(who == null) return null;
if("ERLANGSHEN".equalsIgnoreCase(who)) {
return new Erlangshen();
}
if("TAISHANGLAOJUN".equalsIgnoreCase(who)) {
return new Taishanglaojun();
}
return null;
}
}
(5)第五步,工厂已经建好,然后就是生产了,因为前面我们说到,用到什么帮手就产生什么工厂,然后产生
public class HelperFactory {
public static AbstractHelperFactory getAbstractHelperFactory(String type) {
if("help".equalsIgnoreCase(type)) {
return new NewBangshouFactory();
}
if("third".equalsIgnoreCase(type)) {
return new ThirdbangshouFactory();
}
return null;
}
}
(6)第六步,测试
public class TestAbstract {
public static void main(String[] args) {
/**
* 第一步,我要试试悟空他们能打得过不,拿到生产悟空的工厂
* */
AbstractHelperFactory a1 = HelperFactory.getAbstractHelperFactory("help");
/**
* 第二步,我要石猴
* */
Bangshou b = a1.getBanshou("WUKONG");
/**
* 打架去吧
* */
b.whoAmI();
/**
* 打不过,请求支援,需要用到第三方工厂
* */
AbstractHelperFactory a2 = HelperFactory.getAbstractHelperFactory("third");
/**
* 我要二郎神
* */
Thirdbangshou t = a2.getThirdbangshou("erlangshen");
/**
* 二郎神出战
* */
t.whoHelper();
}
}
(7)效果图
抽象工厂模式,本质就是不同的工厂生产不同的产品,然后我们需要用产品的时候,就选择哪个工厂生产哪种产品。