博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式系列】--抽象工厂
阅读量:5844 次
发布时间:2019-06-18

本文共 3196 字,大约阅读时间需要 10 分钟。

在前面中,介绍过工厂方法模式,那么抽象工厂和工厂方法模式有哪些不一样呢?抽象工厂又可以解决什么样的问题呢?她在实际应用中又是如何发挥她的作用呢?今天这篇博文小编来主要简单的介绍一下抽象工厂模式,希望对有需要的小伙伴有帮助,不足之处,还请小伙伴多多指教。首先,我们来看一下什么是抽象工厂模式:
什么是抽象工厂?

抽象工厂模式是所有形态的工厂模式中最为抽象和最具其一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。简单来说就是,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。以之前的demo为例,拷贝Apple、Banana、Fruit,并且修改Apple和Banana的代码部分,如下所示,首先修改Apple的代码部分:

public abstract class Apple implements Fruit  {	/**	 * 采集	 */	public abstract void get();}
Banana的代码部分,如下所示:

public abstract class Banana implements Fruit {	/**	 * 采集	 */	public abstract void get();}
新建类NorthApple并继承Apple,编写代码如下所示:

public class NorthApple extends Apple {	@Override	public void get() {		System.out.println("采集北方苹果");	}}
同样新建南方苹果类SouthApple,继承Apple类,并编写相关的代码部分,如下所示:

public class SouthApple extends Apple {	@Override	public void get() {		System.out.println("采集南方苹果");	}}
同样新建NorthBanana和SouthBanana,代码类似NorthApple和SouthBanana,小编在这里就不一一进行介绍了,接着新建类FruitFactory,编写相关的代码部分,如下所示:

public interface FruitFactory {	//实例化Apple	public Fruit getApple();	//实例化Banana	public Fruit getBanana();}
新建类NorthFruitFactory,编写相关代码部分,如下所示:

public class NorthFruitFactory implements FruitFactory {	@Override	public Fruit getApple() {		return new NorthApple();	}	@Override	public Fruit getBanana() {		return new NorthBanana();	}}
同样的需要新建SouthFruitFactory,代码部分和NorthFruitFactory类似,不在赘述,新建类,MainClass,编写相关代码如下所示:
public class MainClass {	public static void main(String[] args){		FruitFactory ff = new NorthFruitFactory();		Fruit apple = ff.getApple();		apple.get();				Fruit banana = ff.getBanana();		banana.get();				FruitFactory ff2 = new SouthFruitFactory();		Fruit apple2 = ff2.getApple();		apple2.get();				Fruit banana2 = ff2.getBanana();		banana2.get();	}}
接着,我们来运行一下,效果如下所示:

添加类WenshiApple类,并继承Apple类,编写代码如下所示:

public class WenshiApple extends Apple {	@Override	public void get() {		System.out.println("采集温室苹果");	}}
同样的编写WenshiBanana,并继承Banana,编写相关代码和上述类似。

接着创建WenshiFruitFactory并实现FruitFactory,编写相关代码部分,如下所示:

public class WenshiFruitFactory implements FruitFactory {	@Override	public Fruit getApple() {		return new WenshiApple();	}	@Override	public Fruit getBanana() {		return new WenshiBanana();	}}
编写MainClass里面的代码部分,如下所示:

public class MainClass {	public static void main(String[] args){		FruitFactory ff = new NorthFruitFactory();		Fruit apple = ff.getApple();		apple.get();				Fruit banana = ff.getBanana();		banana.get();				FruitFactory ff2 = new SouthFruitFactory();		Fruit apple2 = ff2.getApple();		apple2.get();				Fruit banana2 = ff2.getBanana();		banana2.get();				FruitFactory ff3 = new WenshiFruitFactory();		Fruit apple3 = ff3.getApple();		apple3.get();				Fruit banana3 = ff3.getBanana();		banana3.get();			}}
我们来看一下运行效果,如下所示:

模式中包含的角色及其职责

抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂(Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色
抽象模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色

抽象模式所创建的具体实例对象

小编寄语:该博文,小编主要介绍了抽象工厂,结合之前学习过的模式,我们发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

转载地址:http://pfhcx.baihongyu.com/

你可能感兴趣的文章
Android中SQLite应用详解
查看>>
【hibernate框架】一对多(多对一)双向CRUD-Cascade1
查看>>
【jQuery】2.jquery基础知识2
查看>>
Java线程:创建与启动(二)
查看>>
Android Studio 小技巧合集
查看>>
使用vmime收取邮件
查看>>
JPA2.1 中三个提升应用性能的新功能
查看>>
HTML5编写格式命令详解
查看>>
MySQL 加锁处理分析
查看>>
[程序员面试题精选100题]50.树的子结构
查看>>
Android 架构之高可用移动网络连接
查看>>
django数据模型中null和blank的区分
查看>>
2.理解JavaScript的浮点数
查看>>
Jenkins+XCode9自动打包错误处理
查看>>
讨论下垂直水平居中的多种方案
查看>>
Android自定义View-------Canvas动画的误解
查看>>
svg 编辑器的点击事件兼容pc端和移动端方案
查看>>
高性能图片压缩 —— libjpeg-turbo 的编译与集成
查看>>
阿里云新用户:巧用余额预警防止自动扣费
查看>>
Spring+MyBatis实现读写分离
查看>>