设计模式学习总结之工厂模式

工厂模式

概述:

在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供
不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构

定义:

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到
其子类。工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,
创建具体的产品对象。

角色:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值