【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)
1. 抽象工厂模式的介绍
工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题。
在抽象工厂模式的结构图有以下角色:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同的产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
2. 抽象工厂模式的结构
AbstractProductA和AbstractProductB是两个抽象产品 ,之所以为抽象,是因为它们都有可能有两种不同的实现。而ProductA1、ProductA2和ProductB1、ProductB2就是对两个抽象产品的具体分类的实现 。
通常是在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。
3. 抽象工厂模式的实现
定义抽象工厂生产武器和交通工具:
package com.siyi.abstractfactory;public abstract class AbstractFactory {public abstract Vehicle createVehicle();public abstract Weapon createWeapon() ;
}
定义抽象产品:
package com.siyi.abstractfactory;/*** 定义抽象交通工具*/
public abstract class Vehicle {public abstract void go();
}----------------------------------package com.siyi.abstractfactory;/*** 定义抽象武器*/
public abstract class Weapon {public abstract void shoot();
}
定义具体产品:
package com.siyi.abstractfactory;public class Arrow extends Weapon {@Overridepublic void shoot() {System.out.println("使用箭射击");}
}-------------------------------------------------package com.siyi.abstractfactory;public class Pistol extends Weapon{@Overridepublic void shoot() {System.out.println("使用手枪射击");}
}-------------------------------------------------package com.siyi.abstractfactory;public class Carriage extends Vehicle {@Overridepublic void go() {System.out.println("坐马车远行");}
}-------------------------------------------------package com.siyi.abstractfactory;public class Car extends Vehicle {@Overridepublic void go() {System.out.println("坐小汽车远行");}
}
定义具体工厂:
package com.siyi.abstractfactory;/*** 古代工厂*/
public class AncientFactory extends AbstractFactory {@Overridepublic Vehicle createVehicle() {return new Carriage();}@Overridepublic Weapon createWeapon() {return new Arrow();}
}-----------------------------------------------------package com.siyi.abstractfactory;/*** 现代工厂*/
public class ModernFactory extends AbstractFactory {@Overridepublic Vehicle createVehicle() {return new Car();}@Overridepublic Weapon createWeapon() {return new Pistol();}
}
主方法:
package com.siyi.abstractfactory;public class Main {public static void main(String[] args) {//创建具体工厂对象AbstractFactory modernFactory = new ModernFactory();AbstractFactory ancientFactory = new AncientFactory();//通过具体工厂创建具体产品Vehicle modernVehicle = modernFactory.createVehicle();Weapon modernWeapon = modernFactory.createWeapon();modernVehicle.go();modernWeapon.shoot();System.out.println("------------------");Vehicle ancientVehicle = ancientFactory.createVehicle();Weapon ancientWeapon = ancientFactory.createWeapon();ancientVehicle.go();ancientWeapon.shoot();}
}
运行结果如下:
坐小汽车远行
使用手枪射击
------------------
坐马车远行
使用箭射击
4. 抽象工厂模式的优缺点
1、优点
(1)具体产品在应用层代码隔离,无须关心创建细节
(2)将一系列的产品族统一到一起创建
2、缺点
(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
(2)增加了系统的抽象性和理解难度
【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)相关推荐
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...
- 设计模式剖析——抽象工厂模式Abstract Factory Pattern
含义 与工厂方法模式相比,概念有些不一样.有抽象零件.抽象产品.抽象工厂.用零件来组装出产品,组装出的产品才是完整的产品. 既然一个完整产品需要多个零件,那么每种具体工厂自然也需要可以同时生产出多种零 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 详解
抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...
- 抽象工厂模式 Abstract Factory Pattern
源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...
- 抽象工厂模式-Abstract Factory Pattern
抽象工厂模式-Abstract Factory Pattern 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽 ...
- 从零开始学设计模式(四):工厂模式(Factory Pattern)
作者平台: | CSDN:blog.csdn.net/qq\_4115394- | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- ...
- 设计模式之抽象工厂模式(Abstract Factory)摘录
面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...
- 设计模式之抽象工厂模式---abstract factory
模式的介绍 模式的定义 Provide an interface for creating families of related or dependent objects without speci ...
最新文章
- Apache Camel 2.15.0 发布,Java 规则引擎
- Facebook:正变为下一个微信?
- 企业级java springcloud b2bc商城系统开源源码二次开发-hystrix 请求缓存
- Jenkins之gitlab配置
- hibernate debug学习总结
- 处理顶点——使用索引移除冗余顶点
- c语言第一课程序代码怎么打,【北北的小程序】北のC语言第一课:helloworld
- ServiceMix中文教程
- RPi 树莓派 DSI 接口研究 MIPI raspberry pi
- c#金额转换成中文大写金额
- 修改map.html,HTML map 标签 | 菜鸟教程
- 云图说|知道吗?在和你对话的那头,也许是个机器人哦~
- 无连接可靠传输_计算机网络-网络层和传输层
- 贪心----最优合并问题
- f5在运营商计费系统中的版本升级割接详细步骤
- 【Eclipse】Spring Tool Suite插件
- 翻译: 构建基于卡尔曼滤波器的 IMU 用速度数据改进 IMU 姿态估计
- 最有效的更改linux 系统时区的方法
- 斯坦福最新研究:看图“猜车祸”,用谷歌街景数据建立车祸预测新模型
- xshell功能大全(上)
热门文章
- linux下常用命令查看端口占用
- Web2.0必读的24部经典专著
- H5摄像头(新版浏览器https)(兼容老版浏览器) html5调用摄像头
- 一个大学应届生的互联网创业心得
- 纵览2023世界人工智能大会:百模大战4个月,中国AI产业怎么样了?
- CAD2014三维旋转 rotate3D
- asp.net1045-巴氏鲜奶管理系统
- Python 自动化指南(繁琐工作自动化)第二版:十六、使用 CSV 文件和 JSON 数据
- C/C++htonl(), ntohl(), ntohs(),htons()
- a元素和它的多重人格以及伪类