设计模式之简单工厂模式
来源:互联网 发布:公司大数据 编辑:程序博客网 时间:2024/06/05 17:53
提到工厂模式,有必要先说明下,工厂模式其实包含了三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。其中,简单工厂模式并不属于GOF 23中设计模式中。先看下简单工厂模式。
简单工厂模式
意图
一个工厂类根据传入的参量,动态决定应该创建出哪一个产品类的实例。
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。
模式结构及参与者
Factory:工厂角色
接受客户端的请求,通过请求负责创建相应的产品对象。
AbstractProduct:抽象产品角色
工厂模式所创建对象的父类或是共同拥有的接口。可以是抽象类或接口。
ConcreteProduct:具体产品角色
工厂模式所创建的对象都是这个角色的实例。实例
public void pay(String type){ if(type.equalsIgnoreCase("cash")){ //现金支付处理代码 }else if(type.equalsIgnoreCase("creditcard")){ //信用卡支付处理代码 } else if(type.equalsIgnoreCase("voucher")){ //代金券支付处理代码 }else{ …… }}那么上述代码,我们可以看出,此段代码带有很多的判断逻辑,较为复杂,难以维护。下面对上述代码进行重构。
public abstract class AbstractPay{ public abstract void pay();}
public class CashPay extends AbstractPay{ public void pay(){ //现金支付处理代码 }}
public class PayMethodFactory{ public static AbstractPay getPayMethod(String type){ if(type.equalsIgnoreCase("cash")){ return new CashPay(); //根据参数创建具体产品 } else if(type.equalsIgnoreCase("creditcard")){ return new CreditcardPay(); //根据参数创建具体产品 } …… }}
效果
简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节。
优点
1)将对象的创建和对象本身业务处理分离,可以降低系统的耦合度,使得两者修改起来都相对容易。
2)由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可。
缺点
简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
模式应用场景
在JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间。
public final static DateFormat getDateInstance();public final static DateFormat getDateInstance(int style);public final static DateFormat getDateInstance(int style,Locale locale);
模式扩展
简单工厂模式的简化:在有些情况下,一个抽象产品类同时也是子类的工厂,也就是说把静态工厂方法写到抽象产品类中。
- 设计模式 之简单工厂+ 工厂模式
- 设计模式之简单工厂设计模式
- 设计模式之简单工厂模式,工厂模式,策略模式
- 设计模式 之 简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂.
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 【C++】拷贝构造函数与赋值操作符的本质性区别分析
- 使用CASE WHEN进行字符串替换处理
- windows下搭建cocos2dx Android开发环境
- 画椭圆 - HTML5 Canvas 作图
- 拷贝构造函数的疑问
- 设计模式之简单工厂模式
- WSAEventSelect
- jquery中ajax方法使用json需注意的小问题
- QTP录制过程中关于浏览器设定的问题
- 【Div+Css笔记】0x04 进阶准备
- linux 磁盘分配
- ENVI 5——全新的软件界面
- 画圆角 - HTML5 Canvas 作图
- MySQL中order by的实现 和 by rand() 和优化