Java设计模式——抽象工厂模式
文章目录
- 抽象工厂
- 概念
- 优缺点
- 优点
- 缺点
- 适用场景
- 代码案例
抽象工厂
使用工厂方法模式足以应付我们可能遇到的大部分业务需求。
但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是我们所希望的。所以建议在这种情况下使用简单工厂模式与工厂 方法模式相结合的方式来减少工厂类:
即
- 对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现
- 如果产品树上涉及多个产品族,则可以使用抽象工厂模式
下面我们来详细看一下抽象工厂:
概念
抽象工厂模式(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设计模式——抽象工厂模式相关推荐
- 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)
[JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...
- java设计模式---抽象工厂模式
工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...
- 程序设计之Java设计模式(抽象工厂模式)
原文地址:http://zhangwei-david.iteye.com/blog/2187627,该文通俗易懂,实为经典! 在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互 ...
- Java设计模式--抽象工厂模式
抽象工厂模式(别名:配套) 提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类. Abstract Factory Pattern(Another Name: Kit) Provide a ...
- JAVA设计模式 - 抽象工厂模式
抽象工厂模式(Abstact Factory Pattern) , 也是创建型模式之一 . 之前主要介绍了工厂方法模式 , 抽象工厂模式和工厂方法模式稍有区别 . 工厂方法模式中工厂类生产出来的产品都 ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- java设计模式之工厂模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之工厂模式篇 (转)
Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿 本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...
最新文章
- 使用jQuery for Asp.Net 我的开发环境配置
- php 权限管理对节点控制,我对权限控制系统的看法_php
- python selenium 处理弹窗_python中能否使用selenium获取弹窗的文本内容?
- 程序员,如何摆脱平庸?
- Codrops 优秀教程:基于 CSS3 的全屏网页过渡特效
- docker学习1--dockerfile
- 【oracle】如何恢复误删的表记录数据
- Android Studio 修改包名 com.example.calculator-----gt;com.melon.calculator
- 计算机考试数据库相关知识点,计算机等级考试四级数据库工程师知识点总结
- 2018-12-20 第二章Java 预习作业
- 用DELPHI下载官方SVN中的示例原码
- C盘空间莫名丢失20G?
- 在线算法 离线算法
- 微服务 细颗粒度的 soa
- Ubuntu下编译OpenHarmony
- EMC——青青子衿,居易安信
- 开源 微商分销系统 php,[PHP程序] 微商新零售分销平台源码Thinkphp内核 产品营销推广神器...
- 公众号开发(三)----接收事件推送之关注/取消关注事件
- (01)ORB-SLAM2源码无死角解析-(58) 闭环线程→计算Sim3: 源码Sim3Solver::iterate()讲解
- 用Java实现二叉树的遍历
热门文章
- [转] 怀孕期间可以让孩子变漂亮的办法
- c语言野指针应用,C语言中野指针的深入解析
- 佳明本能 Instinct 2系列 评测
- CSS prefers-color-scheme 与 matchMedia() 深浅色模式
- 如何使用Python预测机票价格
- 2022年最受欢迎的10款网络游戏
- group by与order by的区别
- 【贪心算法之“买卖股票问题”——C++实现 (附源代码及运行截图)】
- C# 五十五、C#中使用Json
- 7的整除特征 三位一截_7的整除特征(7,11,13的整除特征)