设计模式学习总结之工厂模式
来源:互联网 发布:linux 进入vim命令 编辑:程序博客网 时间:2024/05/22 03:21
工厂模式
概述:
在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构
定义:
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。
角色:
Product(抽象产品) 定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类ConcreteProduct(具体产品) 实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应Factory(抽象工厂)在抽象工厂类中,声明了工厂方法,用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口ConcreteFactory(具体工厂) 他是抽象工厂类的子类,实现了抽象工厂定义的工厂方法,可由客户端调用,返回一个具体产品类的实例。
使用方式
在抽象工厂中声明了工厂方法但并未实现工厂方法,具体产品对象的创建由其子类负责,客户端针对抽象工厂编程,可在运行时再指定具体工厂类,具体工厂类实现了工厂方法,不同的具体工厂可以创建不同的具体产品。在实际使用时,具体工厂类在实现工厂方法时除了创建具体的产品对象之外,还可以负责产品对象的初始化工作以及一些资源和环境配置工作,例如连接数据库,创建文件等。
优点
1)在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。2)基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。3)使用抽象工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体的工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合"开闭原则"
缺点
1)在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。2)由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM,反射等技术,增加了系统的实现难度。
适用场景
1)客户端不知道它需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。2)抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
相关技术:
Java反射(Java Reflection)
在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、父类等信息,还包括实例的创建和实例类型的判断等。在反射中使用最多的类是Class,Class类的实例表示正在运行的Java应用程序中的类和接口,其forName(String className)方法可以返回与带有给定字符串名的类或接口相关联的 Class对象,再通过Class对象的newInstance()方法创建此对象所表示的类的一个新实例,即通过一个类名字符串得到类的实例。如创建一个字符串类型的对象,其代码如下: //通过类名生成实例对象并将其返回 Class c=Class.forName("String"); Object obj=c.newInstance(); return obj;
阅读全文
0 0
- 设计模式学习总结之工厂模式
- 设计模式之简单工厂模式,工厂模式,抽象工厂模式学习总结
- 设计模式之简单工厂模式,工厂模式,抽象工厂模式学习总结
- 设计模式学习总结之简单工厂模式
- 设计模式学习总结之抽象工厂模式
- Java设计模式(2)之工厂模式学习总结
- 设计模式总结之工厂模式
- 设计模式之工厂模式总结
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式学习之工厂模式(简单工厂模式)
- 设计模式学习之简单工厂模式和工厂模式
- 设计模式入门学习之工厂模式
- 设计模式学习笔记之工厂模式
- 设计模式学习之简单工厂模式
- 设计模式学习之工厂模式
- 设计模式 学习之工厂方法模式
- 设计模式之简单工厂模式学习
- iOS NSNotificationCenter监听移除
- [Leetcode] 162. Find Peak Element 解题报告
- 矩形嵌套 DAG
- JDBC、JDBCTemplate、MyBatis、Hiberante 比较与分析
- HttpClient使用示例
- 设计模式学习总结之工厂模式
- OpenSL ES 进行音频解码播放
- plsql方式导入带有外键约束的表
- Android 开发:由模块化到组件化(一)
- kafka-整体架构
- iOS中计算缓存文件的大小判断
- MongoDB学习笔记
- (53)用在宏上的#符号
- 用xampp在本地建立的wordpress网站修改数据库密码后无法登陆