`
yangshen998
  • 浏览: 1248559 次
文章分类
社区版块
存档分类
最新评论

java 设计模式 学习笔记(3) 抽象工厂模式

 
阅读更多

抽象工厂模式 : 提供一个创建一系列相关的或相互依赖对象的接口,而无需指定它们具体的类。

1. 在这个设计模式中,有抽象工厂接口, AbstracFactory Class 。这个接口有两个方法,分别用来创建抽象 Animal 和 抽象 Fruit 。也就是说,它会分别创建Animal 和 Fruit ,但具体不确定到底是 创建 Animal 中的 Bear 还是 Cat ,创建 Fruit 中的 Banana 还是 Apple。

2. 类似于前面两种工厂 类,抽象工厂模式有两个抽象产品,分别是 Animal 和 Fruit 。当然也可以再添加抽象产品 Human 之类的,但 这个时候就可能要在 工厂类中添加 createHuman 方法。

3. 分别有cat,bear 类继承了 Animal 类, Apple ,banana 类继承了Fruit。 其中Bear 类重写了 shout() 方法,用来表示Bear 和 Cat 是两个不同的产品。同样Apple 类重写了 eat() 方法来表示和 Banana 的不同实现。

4. 建立一个具体工厂类SpecificFactory1来implements 抽象工厂,并实现了 createAnimal () 和 createFruit() 方法,来创建一个 Bear 和 一个 Apple

5. 建立一个具体工厂类SpecificFactory12来implements 抽象工厂,并实现了 createAnimal () 和 createFruit() 方法,来创建一个 Bear 和 一个 Banana 。

6. 建立TestAbstractFactory 类来测试实验结果:

1.先声明一个抽象工厂AbstractFactory,接着 用具体工厂SpecificFactory1 来对它赋值

2. 分别创建一个 抽象Fruit 类和一个 抽象Animal 类,

3. 调用 Fruit 的eat()方法 和 调用 Animal 的 shout() 方法

从这里的逻辑可以看出,关键在于我们用了哪一个具体工厂来给 AbstractFactory 赋值,赋值不一样,那么产生的两个产品类也不一样,最后导致产品类调用 eat 和 shout 方法产生的结果不一样。

如果将

AbstractFactory factory = new SpecificFactory1();

改成

AbstractFactory factory = new SpecificFactory2();

其他地方代码不变,那么结果将是:

you create a bear in Bear class
you eat a :Banana

最后的讨论:

为什么要使用抽象工厂?

根据上面的实验结果,可以知道,用户需要创建两种产品,但具体着两种产品中的哪两个产品可能会随着时间的变化而变化。一个种类的产品的差异在于其具体实现不同,但有其共同点。通俗地讲,用户需要一个宠物和一个水果,他需要一个宠物来陪他,还需要一个水果吃。但是用户只喜欢宠物中的Bear 和 Cat ,也只喜欢 水果中的 Apple 和BANANA 。但现在不确定到底是要宠物中的Bear 或Cat,水果中的Apple 或 Banana。那么这个时候,就应该抽象出一个 Animal 类和一个 Fruit 类,Animal 类中有shout 方法类陪他解闷,Fruit 类中eat() 方法类给他填饱肚子。

因为他只需要一个 Animal 和一个 Fruit ,假设我们一开始就建立一个具体工厂来分别创建一个 Bear 类 和 一个Apple 类。如果用户这个时候喜欢 Bear 和 BANANA 的组合,那么我们就得修改 这个具体工厂类,让其创建一个Bear 类和一个 BANANA类,假设用户的需求一直在变化,那么我们就得一直更改这个具体工厂。如果修改的地方多了,那么我们在改代码的时候就非常容易出错。

这个时候就建立一个 抽象工厂,来创建 一个抽象 的Animal和一个抽象的 Fruit。然后建立一个具体工厂来Implements 抽象工厂,并实现了createFriut () 和 createAnimal() ,用来创建 Bear 和Apple 组合。并在用户代码中使用多态来的方式来创建Animal 类和Fruit 类。

AbstractFactory factory = new SpecificFactory2();
Animal animal = factory.createAnimal();
Fruit fruit = factory.createFruit();

如果用户不喜欢Bear 和Apple 组合,改成了喜欢 Cat 和 Banana 组合,那么我就再建议一个 具体工厂类,来分别创建一个 Cat 类 和一个Banana 类,而只需要在用户代码中 将SpecificFactory2 改成 SpecificFactoryX 就可以了,除了新建的具体工厂类,其他地方的代码都不用做修改。

分享到:
评论

相关推荐

    Java设计模式学习笔记(1) — 简单工厂

    定义: 结构说明: 相关概念: 接口: 接口与抽象类的区别: 面向接口编程: 功能: 时序图: 优缺点: 代码阐释:

    尚硅谷设计模式源码笔记课件.zip

    共150讲,时长共 33...1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    1. 创建型模式:创建型模式关注对象的创建过程,包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式。这些模式可以帮助我们更灵活地创建对象,避免直接使用new关键字来创建对象,降低...

    java版中国象棋源码-hello-design-pattern:设计模式学习笔记

    设计模式学习笔记,此项目参考《大话设计模式》,只能作为入门级设计模式学习 设计原则 职责单一原则 开放-封闭原则 依赖倒转原则 高层模块不依赖底层模块,两个模块都应该依赖抽象。抽象不依赖细节,细节依赖抽象。...

    酒店管理客房系统Java源码-GOF23:Java实现23种设计模式学习笔记

    酒店管理客房系统Java源码 创建型模式:关注对象的创建过程 :保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 ...抽象工厂模式是工厂模式的一种升级版本。 :分离了对象子组件的单独构造(由Builder来负

    Java中的design-patterns::open_book:使用通俗易懂的案例,类图,以及配套学习笔记来详解Java的二十种设计模式!

    参考书籍(推荐): 《Java设计模式 - 刘伟》 , 《图解设计模式 - [日]结城浩》 创建型模式 :check_mark:简单工厂模式( Simple Factor Pattern ) :memo: , :check_mark:工厂方法模式( Factory Method Pattern )...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    describe:设计模式学习笔记 逻辑结构图 代码结构图 设计模式简述 创建型模式,共五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式,共七种:适配器模式,装饰器模式,代理模式,...

    java8源码-akangaroo:学习笔记,完善中

    学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...

    java-design-patterns:java 学习模式

    Java Design Patterns 学习笔记 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    Java开发详解.zip

    031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义Annotation笔记.pdf 031603_【第16章:Annotation】_反射...

    Java学习笔记-个人整理的

    {2.9}抽象与接口}{59}{section.2.9} {2.10}访问控制}{60}{section.2.10} {2.10.1}类的属性}{60}{subsection.2.10.1} {2.10.2}类的方法}{61}{subsection.2.10.2} {2.10.3}静态代码块}{62}{subsection.2.10.3} {...

    java基础笔记

    java初学者的学习笔记,很详细。 目录 0 第一节 7月15日 2 一、 IT行业相关介绍 2 二、C、C++和Java语言的比较 2 三、 JDK基础介绍 2 四、 面向对象与面向过程的比较 2 五、 Java相关介绍 2 六、 Path和Classpath...

    左程云leetcode-hjLearningNotes:hj学习笔记

    第一部分:设计模式 & UML 简单工厂 工厂方法模式 抽象工厂模式 策略模式 责任链模式 命令模式 模板方法模式 适配器模式 代理模式 外观模式 组合模式 装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 ...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    leetcode题库-study-prj:学习日记:rocket:

    设计模式共23种(大部分文献也有24种的说法,增加了空对象模式),常用一定要掌握的设计模式:单例模式、工厂模式、抽象工厂模式、策略模式、装饰模式、适配器模式、桥接模式、观察者模式 codetips :closed_book: ...

    博客内容索引(2020-03-22)

    Python学习笔记系列 Hello World Python规范 Python变量 裴波那契数列 Python迭代器 Python函数 Python数据结构 模块及部分常见模块详解   戏说系列 校花系列 我与校花同桌之间的金钱交易(又名:戏说值传递与引用...

Global site tag (gtag.js) - Google Analytics