趣味设计模式之抽象工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)效果图

    抽象工厂模式,本质就是不同的工厂生产不同的产品,然后我们需要用产品的时候,就选择哪个工厂生产哪种产品。

猜你喜欢

转载自blog.csdn.net/YQYnsmile/article/details/82969362
今日推荐