文章目录

  • 抽象工厂
    • 概念
    • 优缺点
      • 优点
      • 缺点
    • 适用场景
    • 代码案例

抽象工厂

使用工厂方法模式足以应付我们可能遇到的大部分业务需求。

但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是我们所希望的。所以建议在这种情况下使用简单工厂模式与工厂 方法模式相结合的方式来减少工厂类:

  • 对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现
  • 如果产品树上涉及多个产品族,则可以使用抽象工厂模式

下面我们来详细看一下抽象工厂:

概念

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

首先我们要理解产品族和产品等级:

  • 产品族:一个品牌下面的所有产品;例如奥迪下面的商务型、MINI型称为华为的产品族;

  • 产品等级:多个品牌下面的同种产品;例如奥迪和宝马下面的各种商务车型,称为一个产品等级;

抽象工厂模式的各个角色和工厂方法的如出一辙:

角色 说明
抽象工厂角色 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的 父类。在java中它由抽象类或者接口来实现
具体工厂角色 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它 由具体的类来实现
抽象产品角色 它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现
具体产品角色 具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现

优缺点

优点

抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展

缺点

抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这就违背了"开闭原则"。

适用场景

使用抽象工厂模式的系统应该符合以下几个条件:

  • 一个系统不要求依赖产品实例如何被创建、组合和表达
  • 这个系统有多个系列产品,而系统中只消费其中某一系列产品
  • 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现

下面我们实现一个案例来分析一下

代码案例

以生产不同厂牌生产不同车型为例子:

  • 有商务车和MINI型车 两种产品,定义两个接口;
  • 奔驰、奥迪、宝马都可以生产这两种产品,所以有6(2*3)个实现类;
  • 现在需要创建奔驰、奥迪、宝马的工厂类,先将工厂类进行抽象,里面有创建两个产品的方法,返回的是产品的接口类;
  • 创建奔驰、奥迪、宝马的工厂实现类,继承工厂类接口,实现创建各自产品的方法;
  • 客户端调用时,直接用工厂接口类创建需要的工厂,拿到对应的型号的产品;

类图分析:

代码如下:

商务车抽象产品族:BusinessCar

package com.shixun.design.factory.abstract_factory;import com.shixun.design.factory.Car;/*** 抽象产品族(BusinessCar)*/
public interface BusinessCar extends Car {boolean isAutoDoor();
}

MINI车抽象产品族:SportCar

package com.shixun.design.factory.abstract_factory;import com.shixun.design.factory.Car;/*** 抽象产品族(SportCar)*/
public interface SportCar extends Car {boolean isStrong();
}

AodiBusinessCar

package com.shixun.design.factory.abstract_factory;/*** 新业务奥迪商务汽车*/
public class AodiBusinessCar implements BusinessCar {@Overridepublic boolean isAutoDoor() {return false;}@Overridepublic void show() {System.out.println("我是Aodi的商务汽车");}
}

AodiSportCar

package com.shixun.design.factory.abstract_factory;/*** 新业务奥迪运动汽车*/
public class AodiSportCar implements SportCar {@Overridepublic boolean isStrong() {return false;}@Overridepublic void show() {System.out.println("我是Aodi的运动汽车");}
}

BenzBusinessCar

package com.shixun.design.factory.abstract_factory;/*** 具体产品(BenzBusinessCar)*/
public class BenzBusinessCar implements BusinessCar {@Overridepublic boolean isAutoDoor() {return true;}@Overridepublic void show() {System.out.println("我是Benz的商务汽车");}
}

BenzSportCar

package com.shixun.design.factory.abstract_factory;/*** 具体产品(BenzSportCar)*/
public class BenzSportCar implements SportCar {@Overridepublic boolean isStrong() {return true;}@Overridepublic void show() {System.out.println("我是Benz的运动汽车");}
}

BmwBusinessCar

package com.shixun.design.factory.abstract_factory;/*** 具体产品(BmwBusinessCar)*/
public class BmwBusinessCar implements BusinessCar {@Overridepublic boolean isAutoDoor() {return true;}@Overridepublic void show() {System.out.println("我是Bmw的商务汽车");}
}

BmwSportCar

package com.shixun.design.factory.abstract_factory;/*** 具体产品(BmwSportCar)*/
public class BmwSportCar implements SportCar {@Overridepublic boolean isStrong() {return true;}@Overridepublic void show() {System.out.println("我是Bmw的运动汽车");}
}

生产的抽象工厂:CarFactory

定义两个接口方法:

  • 生产商务车
  • 生产MINI车
package com.shixun.design.factory.abstract_factory;/*** 抽象工厂*/
public interface CarFactory {/*** 生产运动汽车** @return*/SportCar produceSportCar();/*** 生产商务汽车** @return*/BusinessCar produceBusinessCar();
}

AodiCarFactory

package com.shixun.design.factory.abstract_factory;/*** 新业务工厂AodiCarFactory*/
public class AodiCarFactory implements CarFactory {@Overridepublic SportCar produceSportCar() {return new AodiSportCar();}@Overridepublic BusinessCar produceBusinessCar() {return new AodiBusinessCar();}
}

BmwCarFactory

package com.shixun.design.factory.abstract_factory;/*** 具体工厂(BenzCarFactory)*/
public class BenzCarFactory implements CarFactory {@Overridepublic SportCar produceSportCar() {return new BenzSportCar();}@Overridepublic BusinessCar produceBusinessCar() {return new BenzBusinessCar();}
}

BenzCarFactory

package com.shixun.design.factory.abstract_factory;/*** 具体工厂(BmwCarFactory)*/
public class BmwCarFactory implements CarFactory {@Overridepublic SportCar produceSportCar() {return new BmwSportCar();}@Overridepublic BusinessCar produceBusinessCar() {return new BmwBusinessCar();}
}

编写测试类:

package com.shixun.design.factory.abstract_factory;/*** 使用者*/
public class Test {public static void main(String[] args) {//生产BmwBmwCarFactory bmwCarFactory = new BmwCarFactory();//宝马运动SportCar bmwSportCar = bmwCarFactory.produceSportCar();System.out.println("宝马运动strong:" + bmwSportCar.isStrong());bmwSportCar.show();//宝马商务BusinessCar bmwBusinessCar = bmwCarFactory.produceBusinessCar();System.out.println("宝马商务autoDoor:" + bmwBusinessCar.isAutoDoor());bmwBusinessCar.show();//生产BenzBenzCarFactory benzCarFactory = new BenzCarFactory();//奔驰运动SportCar benzSportCar = benzCarFactory.produceSportCar();System.out.println("奔驰运动strong:" + benzSportCar.isStrong());benzSportCar.show();//奔驰商务BusinessCar benzBusinessCar = benzCarFactory.produceBusinessCar();System.out.println("奔驰自动autoDoor:" + benzBusinessCar.isAutoDoor());benzBusinessCar.show();//新业务//生产AodiAodiCarFactory aodiCarFactory = new AodiCarFactory();//奥迪运动SportCar aodiSportCar = aodiCarFactory.produceSportCar();System.out.println("奥迪运动strong:" + aodiSportCar.isStrong());aodiSportCar.show();//奥迪商务BusinessCar aodiBusinessCar = aodiCarFactory.produceBusinessCar();System.out.println("奥迪自动autoDoor:" + aodiBusinessCar.isAutoDoor());aodiBusinessCar.show();}
}

运行结果如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginx
  2. 浅谈深度学习混合精度训练
  3. Nature子刊:微生物系统中的功能与功能冗余
  4. java jackson json_使用Java和Jackson将Json序列化为通用结构而无...
  5. Redhat 5.4 Orcle RAC 数据库 从10.2.0.1升级到 10.2.0.4
  6. [云炬创业基础笔记]第四章测试18
  7. vue与php接口对接,怎样使用vue项目中api接口
  8. 车险赔付率分析报告_车险综合改革出台:下调附加费用率,三者限额提至千万...
  9. OSI 七层网络协议的定义与理解
  10. 必须重视针对SCADA系统的***
  11. 计算机abc分类法,ABC分类法.ppt
  12. 关于spring security的URL路径验证问题
  13. linux命令大全 load,linux命令TOP参数load average详解[转]
  14. c# Excel 添加组合Range区域,方便选择Select()删除 Delete()
  15. error: Microsoft Visual C++ 9.0 is required (Unabl
  16. chrome 浏览器的快捷键设置
  17. 冰河亲自整理的Git命令汇总,悄悄努力,然后惊艳所有人
  18. SQLT(SQLTXPLAIN)
  19. vivado中设置多核编译
  20. 将一元人民币兑换成1分、2分、5分,有几种兑换办法?

热门文章

  1. select_shape算子的使用与特性
  2. MD5算法的实现原理
  3. ui和平面设计的区别?ui设计做什么的?
  4. 《程序猿》12月刊约稿:技术走向管理要实现的转变
  5. 首师大附中OJ系统 0019 求圆台的体积
  6. linux 内存爆浆,内存条为什么会引起花屏
  7. 小米android7.0,小米安卓7.0
  8. Ubuntu18.04设置连接网络,使虚拟机下的Ubuntu18.04可以上网
  9. 2014年辽宁省普通高等学校本科大学生计算机设计竞赛,我校学生在辽宁省普通高等学校本科大学生计算机设计大赛中喜获佳绩...
  10. 英语语法---比较级和最高级的用法