镇楼

在某些书中使用了二维图说明抽象工厂模式。非常好,可是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. 忘记commit的一次教训

    由于业务需求,已经上线的系统新增加了一些需求,其中一个需求是,从一个SQLSERVER数据库导入数据到生产的ORCLE数据库, 由于我的失误导致系统上线后 生产的Oracle数据没有导入成功,但是在本 ...

  2. 【HDOJ】3505 Writing Robot

    挺好的一道题目,我的做法是kmp+Dinic网络流.kmp求子串在P中出现的次数,从而计算love值.网络流主要用来处理最优解.case2中p1的love值是8,p2的love值是7,最终T包含p1和 ...

  3. Import Items – Validation Multiple Languages Description

            ð  提交标准请求创建和更新物料,因语言环境与处理次序方式等因素,造成物料中英(更多语言)描述和长描述混乱刷新. 症状: >>> Submit Standard Op ...

  4. CentOS5.5 下编译安装 LAMP

    大纲 1.安装gcc编译器 2.卸载rpm安装的http和mysql软件 3.编译安装php依赖包 4.安装apache软件 5.安装mysql软件 6.安装php软件 7.安装memcache ph ...

  5. Hadoop家族学习路线图

    主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项 ...

  6. JAX-WS(JWS)发布WebService

    WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷.知名的XFile(新的如CXF).Axis1.Axis2等. 而Sun公司也不甘落后,从早期的JAX-R ...

  7. javascript 关于cookie的操作

    <script language=javascript> //获得coolie 的值 function cookie(name){ var cookieArray=document.coo ...

  8. @DataProvider Method 参数传递

    package roger.testng; import java.lang.reflect.Method; import org.testng.annotations.DataProvider; i ...

  9. LittleTools之网格输出为模型

    我经常要在Unity中生成一些网格,但是这些网格需要交给美工修改,所以又要将网格输出为模型.于是就有了下面的代码: using UnityEngine; using UnityEditor; usin ...

  10. r.js 配置文件 build.js 不完整注释

      -----------------------------------------------------------------------r.js 配置文件 example.build.js ...