1. 定义

抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。

2. 角色

抽象工厂模式的角色与工厂方法模式一样,有如下几种:

2.1 抽象产品(Product):

工厂方法模式所创建的对象的超类,也就是所有产品类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。

2.2 具体产品(ConcreteProduct):

这个角色实现了抽象产品(Product)所声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品的实例。

2.3 抽象工厂(Factory):

担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。

2.4 具体工厂(ConcreteFactory):

担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建具体产品对象。

3. 实例

实例模型:我们都知道富士康是手机代工厂,既能生产小米手机,也能生产苹果手机。冠捷是全球有名的电视代工厂,既然生产飞利浦电视,也能生产夏普的电视。

抽象产品接口:

手机抽象类:

package zzw.cn.factory.abstractfactory;/*** 手机抽象类*/
public interface IPhone
{void call();
}

电视抽象类:

package zzw.cn.factory.abstractfactory;/*** 电视抽象类*/
public interface ITV
{void show();
}

抽象工厂类:

手机工厂抽象类:

package zzw.cn.factory.abstractfactory;/*** 抽象工厂类:抽象手机工厂类,负责生产小米手机和苹果手机*/
public interface IPhoneFactory
{IPhone produceMiPhone();IPhone produceApplePhone();
}

电视工厂抽象类:

package zzw.cn.factory.abstractfactory;/*** 电视生产工厂的接口*/
public interface ITVFactory
{ITV producePhilipsTV();//生产飞利浦电视ITV produceSharpTV();//生产夏普电视
}

 具体工厂类:

富士康负责生产具体手机的工厂:

package zzw.cn.factory.abstractfactory;/*** 具体工厂类:富士康手机工厂,负责生产小米和苹果手机*/
public class FoxconnFactory implements IPhoneFactory
{@Overridepublic IPhone produceMiPhone(){return new MiPhone();}@Overridepublic IPhone produceApplePhone(){return new ApplePhone();}
}

冠捷负责生产具体电视的工厂:

package zzw.cn.factory.abstractfactory;/*** 电视生产工厂类:冠捷电视长,负责生产飞利浦和夏普电视*/
public class TPVFactory implements ITVFactory
{@Overridepublic ITV producePhilipsTV(){return new PhilipsTV();}@Overridepublic ITV produceSharpTV(){return new SharpTV();}
}

测试类: 

创建出富士康工厂对象,通过富士康工厂生产小米手机和苹果手机,并用手机拨打电话。创建出冠捷工厂对象,通过冠捷生产飞利浦电视和夏普电视,并使用电视。

package zzw.cn.factory.abstractfactory;public class TestAbstractFactory
{public static void main(String[] args){IPhoneFactory phoneFactory = new FoxconnFactory();IPhone applePhone = phoneFactory.produceApplePhone();applePhone.call();IPhone miPhone = phoneFactory.produceMiPhone();miPhone.call();ITVFactory tvFactory = new TPVFactory();ITV philipsTV = tvFactory.producePhilipsTV();philipsTV.show();ITV sharpTV = tvFactory.produceSharpTV();sharpTV.show();}
}

结果:

I am a Apple Phone.
I am a MI Phone.
I am a Philips TV.
I am a SHARP TV.Process finished with exit code 0

4. 优缺点

优点:

a. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

b. 增加新的具体工厂和产品族很方便,因为一个具体的工厂实现代表的是一个产品族,无须修改已有系统,符合“开闭原则”。

缺点:

a. 在添加新的产品对象(不同于现有的产品等级结构)时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。

b. 增加新的工厂和产品族容易,增加新的产品等级结构麻烦。

Java设计模式:抽象工厂模式相关推荐

  1. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  2. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

  3. Java设计模式——抽象工厂模式

    文章目录 抽象工厂 概念 优缺点 优点 缺点 适用场景 代码案例 抽象工厂 使用工厂方法模式足以应付我们可能遇到的大部分业务需求. 但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是 ...

  4. 程序设计之Java设计模式(抽象工厂模式)

    原文地址:http://zhangwei-david.iteye.com/blog/2187627,该文通俗易懂,实为经典! 在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互 ...

  5. Java设计模式--抽象工厂模式

    抽象工厂模式(别名:配套) 提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类. Abstract Factory Pattern(Another Name: Kit) Provide a ...

  6. JAVA设计模式 - 抽象工厂模式

    抽象工厂模式(Abstact Factory Pattern) , 也是创建型模式之一 . 之前主要介绍了工厂方法模式 , 抽象工厂模式和工厂方法模式稍有区别 . 工厂方法模式中工厂类生产出来的产品都 ...

  7. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  8. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  9. java设计模式之工厂模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  10. Java设计模式之工厂模式篇 (转)

    Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿  本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...

最新文章

  1. AI大事件 | OpenAI员工离职创立机器人新公司,spaCy v2.0.0发布
  2. poj 3468 线段树
  3. core部署iis的 调试net_远程调试远程 IIS 计算机上的 ASP.NET Core - Visual Studio | Microsoft Docs...
  4. android studio替换jdk,Mac Android Studio JDK7 替换
  5. 【HDU - 1702 】ACboy needs your help again! (栈和队列,水题模拟)
  6. 小汤学编程之JAVA基础day01——JAVA基本概念、第一个JAVA程序
  7. 韦东山驱动视频笔记——6.输入子系统之编写驱动程序
  8. 童鞋们,颜色采色器,实用工具
  9. 计算机二级九月试题office,9月计算机二级office题库及答案
  10. 中国移动 呼叫转移 设置
  11. Android 原生插件开发步骤
  12. pythonturtle作品编程技巧说明_在Python教学中应用turtle创意编程实践
  13. .bat 常用命令
  14. CyberDuck是一个很棒的 FTP SFTP图形化工具
  15. 虚拟机上无法运行ubuntu自带的gazebo仿真器报VMware: vmw_ioctl_command error 无效的参数
  16. 工具传送门(持续更新)
  17. 名创优品通过上市聆讯:寻求双重主要上市 年营收91亿
  18. 已知两点经纬度 计算距离和方位角(MATLAB实现)
  19. 这可能是最全的Web测试各个测试点,有这一篇就够了
  20. vue百度地图 驾车路线修改路径颜色,每条路径颜色不一样

热门文章

  1. AI主播正式上岗,“玩法”百变的人工智能
  2. 锂电池升压充电管理芯片CS5080,CS5086,CS5090,CS5095的功能特性与参数比较
  3. 应用支持向量机对婴儿EEG数据进行多元模式分析
  4. element-ui DateTimePicker 日期选择 日期禁用
  5. GPU上的随机森林:比Apache Spark快2000倍
  6. mac php7安装redis,mac 下安装php7.1 redis
  7. mysql got error 5 during_更新表数据,或者复制数据到新表出现这样问题ERROR 1180 (HY000): Got error 5 during COMMIT...
  8. Centos中开机执行.sh文件
  9. linux mysql etc inid_linux mysql 操作命令
  10. 【linux】循序渐进学运维-基础篇-Linux系统目录