镇楼

在某些书中使用了二维图说明抽象工厂模式。非常好,可是yqj2065不喜欢他们的产品族/产品等级,改成品牌/产品类型。



抽象工厂模式(abstract factory pattern)较工厂方法模式强大之处。是一个工厂可以创建多个配套的产品。

日常生活中。抽象工厂模式比比皆是。比如服装厂能够生产配套的上衣/Tops、下装/Bottoms。电器公司如美的、海尔能够生产其品牌的冰箱、空调、电视机等。

抽象工厂模式的特点就是工厂接口中有两个以上的工厂方法。

例程 2-6 品牌公司
package creational.factory.abstractFactory;
public class NikeFactory implements IClothingFactory{
@Override public Tops getTops(){
return new NikeTops();
}
@Override public Bottoms getBottoms(){
return new NikeBottoms();
}
}

抽象工厂模式概念简单,可是编写演示程序是至少要编写10个类(含Client)。如图所看到的。

显然的,NikeFactory仅仅会生产NikeTops和NikeBottoms,毕竟品牌公司不是山寨或贴牌公司。

(yqj2065在后面考虑山寨问题)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXFqMjA2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

package creational.factory.abstractFactory;
public class Client{
public static void test(){
IClothingFactory f =(IClothingFactory)tool.God.create("2-6-Factory");
Tops tops = f.getTops();
Bottoms bt =f.getBottoms();
System.out.println(tops.getName());
System.out.println(bt.getName() );
}
}

抽象工厂模式包括4个角色。抽象工厂角色,如IClothingFactory。详细工厂角色,前者的子类型;抽象产品角色,如Tops和Bottoms;而详细产品角色,是抽象产品角色的子类型。

从Client的角度看,抽象工厂模式下,通过配置文件指定IClothingFactory,从而获得其生产的上衣/Tops。能够再指定其它的厂家,获得其生产裤子/Bottoms。Client只依赖于抽象工厂角色和抽象产品角色;避免代码中的newNikeTops()和new AdidasBottoms。


2. 扩展性

IClothingFactory的子类,能够依照须要增添。符合OCP。

还有一方面,如果如今的服装厂/IClothingFactory除了生产配套的上衣、裤子外。还生产鞋子/Shoe。

IClothingFactory中须要加入

public Bottoms getShoe ();

Java8之前。接口不能升级。假设定义了接口。将接口送给客户程序猿使用,这时定义的接口就不能改动。由于在接口中加入一个方法,会导致老版本号接口的全部实现类的中断。

现在,在IClothingFactory广泛使用并且很须要与时俱进地加入getShoe()时。Java8的默认方法(defender methods,Virtualextension methods)如同奇妙的懊悔药。

例程 2-7 默认方法
package creational.factory.abstractFactory;
public interface IClothingFactory{
public Tops getTops();
public Bottoms getBottoms();
default public Shoe getShoe(){
return null;
}
}
class Client{
public static void test(){
IClothingFactory f =(IClothingFactory)tool.God.create("2-6-Factory-Nike");
//f =(IClothingFactory)tool.God.create("2-6-Factory-Ad");
Shoe shoe =f.getShoe();
System.out.println(shoe.getName() );
}
}

NikeFactory改写了getShoe(),測试代码中Client能够正常获得Shoe对象;假设指定的详细工厂没有改写了getShoe()。则Shoe对象为null。

接口中加入默认方法,对于没有改写该默认方法的子类,都是一种退化继承——如同鸵鸟是鸟,违反LSP因而违反OCP。

接口中加入默认方法,保证曾经的代码可以正常执行——由于曾经的代码不可能知道也不存在使用getShoe()。因而保证了向前兼容

可是。编写新代码时就必须注意,IClothingFactory有方法getShoe()。可是并不是事实上现类都给出有效的实现。你凭什么觉得IClothingFactory的实例都可以生产鞋子呢?

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXFqMjA2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

简洁 Abstract Factory模式(3.1)的更多相关文章

  1. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  2. Abstract Factory模式的几个要点

    1.如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式.这时候使用简单的静态工厂完全可以.2.“系列对象”指的是这些对象之间有相互依赖.或作用的关系3.Abs ...

  3. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  4. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  5. 设计模式初学者笔记:Abstract Factory模式

    首先啰嗦下创建迷宫所用的Room类.这个类并不直接保存Room四周的构造,而是通过MapSite* _sides[4]这个私有数组成员指向Room四周的构造.那么什么时候将四周构造直接放在Room中, ...

  6. 设计模式(八)Abstract Factory模式

    抽象工厂的工作是将“抽象零件”组装为“抽象产品”.在抽象工厂模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品.也就是说,我们并不关心零件的具体实现,而是只关心接口.我们仅适用该接口将零件组装起来成 ...

  7. 【创建型】Abstract Factory模式 & Factory Method模式

    本文主要介绍简单工厂模式与抽象工厂模式.以下如有叙述不当之处,欢迎批评指正,欢迎交流探讨. 一:简单工厂模式 在23种设计模式中,简单工厂模式其实是不在列的,但理解该模式对于抽象工厂模式的思想理解是有 ...

  8. 23设计模式(3):Abstract Factory模式

    定义:要创建一组相关或依赖对象提供一个接口,而你并不需要指定其具体类别. 类型:创建一个类模型 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者 ...

  9. 【设计模式】Abstract Factory模式

    抽象工厂模式是工厂方法模式的进一步强化.当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以. 可是.当用户程序须要创建多种类型的产品,而这些产品又有一定的内 ...

随机推荐

  1. [jobdu]栈的压入、弹出序列

    用一个栈辅助,模拟过程+判断就可以了. #include <iostream> #include <memory.h> #include <stack> #defi ...

  2. SPRING IN ACTION 第4版笔记-第四章Aspect-oriented Spring-001-什么是AOP

    一. Aspect就是把会在应用中的不同地方重复出现的非业务功能的模块化,比如日志.事务.安全.缓存 In software development, functions that span mult ...

  3. Emmet(前身是zen coding)介绍和使用

    Zen coding - 一种快速编写HTML/CSS代码的方法.它使用仿CSS选择器的语法来快速开发HTML和CSS - 由Sergey Chikuyonok开发. 现在它改名为了Emmet,并且搭 ...

  4. MongoDB实战开发 【零基础学习,附完整Asp.net示例】

    MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...

  5. C#实现调用Java类中方法

    基本思路: 用C#实现调用Java编写的类中的方法:重点是将Java编写的程序打包成Jar,然后使用开源工具IKVM将其转化成DLL控件,在.NET环境下调用. 分为以下步骤: 1.下载JDK6(注: ...

  6. NOIP2010关押罪犯 二分+二染色

    这个题一上来 没有思路,后来想没有思路就二分吧 那么我们来二分 首先,大于当前的mid值的关系,不能出现在一个集合里 (即关系形成的图是一个二分图,判定二分图可以二染色) 如果不能形成二分图,那么说明 ...

  7. SQL经典题-实战

    Student(S#,Sname,Sage,Ssex) 学生表       S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname,T#) 课程表   ...

  8. 【原】Spark中Job如何划分为Stage

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Job的提交 http://www.cnblogs.com/yourarebest/p/5342404.html 1.Spark中 ...

  9. java中的hashtable

    好久没写博客了,这次总结一下hashtable,哈希表是我们在数据结构时候所学,在网络安全时候,老师说可以用来加密,在数据库中,可以用来当作索引. http://www.cnblogs.com/leo ...

  10. Html笔记(七)表单

    表单标签: <form> 表单标签是最常用的标签,用于与服务器端的交互. <input>:输入标签:接受用户输入信息 其中type属性指定输入标签的类型 文本框 text:输入 ...