为了账号安全,请及时绑定邮箱和手机立即绑定

Java之23种设计模式-抽象工厂模式

标签:
Java 面试 架构

一 抽象工厂模式(工厂方法模式请点我

工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产
品。

区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多
个。
工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量
代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有
很多可以复用的特征,所以会和模版方法相随。
抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你
的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一
个抽象工厂继承。
对于 java 来说,你能见到的大部分抽象工厂模式都是这样的:
---它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。
比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可
以生产鼠标和键盘,但可能工厂 A 生产的是罗技的键盘和鼠标,工厂 B 是微软的。
 “玩转”Java 系列


这样 A 和 B 就是工厂,对应于抽象工厂;
每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;
用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了
抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十
个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)
所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线


下面举一个例子:

类图:

https://img1.sycdn.imooc.com//5b5db7230001433805510290.jpg


ICat.java

package com.lxj.abstractfactory;

public interface ICat {
	
    public void eat();
    
}

BlackCat.java

package com.lxj.abstractfactory;

public class BlackCat implements ICat {

	@Override
	public void eat() {
       System.out.println("this is BlackCat");
	}

}

WhiteCat.java

package com.lxj.abstractfactory;

public class WhiteCat implements ICat {

	@Override
	public void eat() {
       System.out.println("this is WhiteCat");
	}

}

IDog.java

package com.lxj.abstractfactory;

public interface IDog {

	 public void eat();
	 
}

WhiteDog.java

package com.lxj.abstractfactory;

public class WhiteDog implements IDog {

	@Override
	public void eat() {
        System.out.println("this is WhiteDog");
	}

}

BlackDog.java

package com.lxj.abstractfactory;

public class BlackDog implements IDog {

	@Override
	public void eat() {
        System.out.println("this is BlackDog");
	}

}

IAnimalFactory.java

package com.lxj.abstractfactory;

public interface IAnimalFactory {
	 
	 public ICat createCat();
	 public IDog createDog();
}

WhiteAnimalFactory.java

package com.lxj.abstractfactory;

public class WhiteAnimalFactory implements IAnimalFactory {

	@Override
	public ICat createCat() {
		//创建白猫
		return new WhiteCat();
	}

	@Override
	public IDog createDog() {
		//创建白狗
		return new WhiteDog();
	}

}

BlackAnimalFactory.java

package com.lxj.abstractfactory;

public class BlackAnimalFactory implements IAnimalFactory {

	@Override
	public ICat createCat() {
		//创建黑猫
		return new BlackCat();
	}

	@Override
	public IDog createDog() {
		//创建黑狗
		return new BlackDog();
	}

}

TestAbstractFactory.java

package com.lxj.abstractfactory;

public class TestAbstractFactory {

	public static void main(String[] args) {
		//创建一只白猫
		WhiteAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
		ICat whiterCat = whiteAnimalFactory.createCat();
		whiterCat.eat();
		//创建一只黑狗
		BlackAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
		IDog blackDog = blackAnimalFactory.createDog();
		blackDog.eat();
	}

}

运行结果:

this is WhiteCat
this is BlackDog

二 总结

        从上面的例子可以知道,抽象工厂模式中,一个抽象工厂类,可以派生多个具体的工厂类,每个具体工厂类可以创建多个具体的产品类的实例,也就是一个产品线下的多个产品,有多个抽象产品类,每个抽象产品类可以派生多个具体的产品。,而在工厂方法模式中的话,一个抽象工厂类,派生多个具体的工厂类,每个工厂类生产一种产品的实例,一个抽象产品类,派生多个具体的产品类。















点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7796
获赞与收藏
665

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消