文章目录

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

抽象工厂

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

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

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

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

概念

抽象工厂模式(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. 使用jQuery for Asp.Net 我的开发环境配置
  2. php 权限管理对节点控制,我对权限控制系统的看法_php
  3. python selenium 处理弹窗_python中能否使用selenium获取弹窗的文本内容?
  4. 程序员,如何摆脱平庸?
  5. Codrops 优秀教程:基于 CSS3 的全屏网页过渡特效
  6. docker学习1--dockerfile
  7. 【oracle】如何恢复误删的表记录数据
  8. Android Studio 修改包名 com.example.calculator-----gt;com.melon.calculator
  9. 计算机考试数据库相关知识点,计算机等级考试四级数据库工程师知识点总结
  10. 2018-12-20 第二章Java 预习作业
  11. 用DELPHI下载官方SVN中的示例原码
  12. C盘空间莫名丢失20G?
  13. 在线算法 离线算法
  14. 微服务 细颗粒度的 soa
  15. Ubuntu下编译OpenHarmony
  16. EMC——青青子衿,居易安信
  17. 开源 微商分销系统 php,[PHP程序] 微商新零售分销平台源码Thinkphp内核 产品营销推广神器...
  18. 公众号开发(三)----接收事件推送之关注/取消关注事件
  19. (01)ORB-SLAM2源码无死角解析-(58) 闭环线程→计算Sim3: 源码Sim3Solver::iterate()讲解
  20. 用Java实现二叉树的遍历

热门文章

  1. [转] 怀孕期间可以让孩子变漂亮的办法
  2. c语言野指针应用,C语言中野指针的深入解析
  3. 佳明本能 Instinct 2系列 评测
  4. CSS prefers-color-scheme 与 matchMedia() 深浅色模式
  5. 如何使用Python预测机票价格
  6. 2022年最受欢迎的10款网络游戏
  7. group by与order by的区别
  8. 【贪心算法之“买卖股票问题”——C++实现 (附源代码及运行截图)】
  9. C# 五十五、C#中使用Json
  10. 7的整除特征 三位一截_7的整除特征(7,11,13的整除特征)