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

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

      在上一篇博客里面,笔者讲到了工厂模式,相信看到的朋友就会感到奇怪,为什么这篇博客又来讲工厂模式呢?是不是重复了?到底工厂模式和抽象工厂模式有什么区别呢?下面就让我们带着这些问题开始进入今天的主题吧!

      首先我们来看看两者的具体定义是怎么说的,工厂模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。抽象工厂模式的定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。通过上面的定义,我们就能很明显发现它们之间的区别。上一篇博客实例里面,我们能够发现创建一个对象的时候,我们会将最终的子类对象传到工厂方法里面,从而能够创建出特定的子类对象。但是在抽象工厂模式里面则不是这样的,它只负责提供一个创建的入口,你想要创建什么对象就调用相应的方法就可以了,不需要传进特定的子类对象。下面笔者将通过一个实例来说明抽象工厂模式的具体使用。

      首先我们来定义一个产品接口Product:

public interface Product {	void shareMethod();	void doSomething();}

然后我们再来定义两个具体的产品ProductA和ProductB,具体代码如下:

public class ProductA implements AbstractProductA {	@Override	public void shareMethod() {		// TODO Auto-generated method stub			}	@Override	public void doSomething() {		// TODO Auto-generated method stub			}}
public class ProductA2 implements AbstractProductA {	@Override	public void shareMethod() {		// TODO Auto-generated method stub			}	@Override	public void doSomething() {		// TODO Auto-generated method stub			}}

在这里我们省略了B产品的定义代码,方法同产品A是一样的。接下来我们是不是就应该开始定义抽象工厂了,代码如下:

public class Create1 extends AbstractCreator {	@Override	public AbstractProductA createProductA() {		return new ProductA();	}	@Override	public AbstractProductB createProductB() {		return new ProductB();	}}
public class Create2 extends AbstractCreator {	@Override	public AbstractProductA createProductA() {		return new ProductA2();	}	@Override	public AbstractProductB createProductB() {		return new ProductB2();	}}

最后我们在需要创建产品A、B的地方调用相应的Create方法就可以了。

      通过上面的方法,我们能够很明显的发现:随着后面的产品组合的增加,我们将需要定义更多的ProductN和CreateN,因为创建者是随着产品的不同组合、不同数量发生变化的。这样的话,我们就需要同时修改多个地方,严重的违背了开闭原则,所以在使用抽象工厂模式的时候,针对多产品需要的场景慎用。

      好了,今天的博客就到这里吧,see you!

转载于:https://www.cnblogs.com/xiaocai20091687/p/xiaocai_design_four.html

你可能感兴趣的文章
numpy数组及处理:效率对比
查看>>
Luogu P1318 积水面积
查看>>
前台线程 和 后台线程
查看>>
PHP性能优化大全(转)
查看>>
shell编程
查看>>
ImageSwitch+Gallery
查看>>
【软件需求工程与建模 - 小组项目】第0周:团队成员介绍
查看>>
unresolved external symbol "public: virtual __thiscall...错误
查看>>
php连接oracle oracle开启扩展
查看>>
入门自定义标签,(在SSH里面有自定义标签的练习)
查看>>
最近遇到的一些问题汇总
查看>>
mysql插入数据报错一二
查看>>
spring mvc 常用前后台数据交互的注解
查看>>
Linux学习12-CentOS设置多个tomcat开机自启动
查看>>
ASP.NET MVC Controller 编程所涉及到的常用属性成员
查看>>
条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function's inherited default parameter value)...
查看>>
HDU 4288 Coder 【线段树+离线处理+离散化】
查看>>
[K/3Cloud] 如何从被调用的动态表单界面返回数据
查看>>
c# winform读取xml创建菜单
查看>>
设计模式-工厂方法 简单工厂 抽象工厂 模板方法
查看>>