Java设计模式——工厂模式
来源:互联网 发布:软件贷款不还会怎么样 编辑:程序博客网 时间:2024/05/19 21:02
简介
概念:实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂方法模式的扩展。
意图:定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。工厂方法把实例化的工作推迟到子类中去实现。
适用情况:有一组类似的对象需要创建。在编码时不能预见需要创建哪种类的实例。系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节。
实现的核心:多态(父类对象指向子类实例)。
主要目的:降低耦合。
工厂模式的任务是实例化对象,代替new操作,但是平时里我们不是经常用到new的么?这么说是没错,平日里自己做练习,写测试,你再写十几个类专门写个工厂模式,除非是在练习工厂模式,否则,YBB,呵呵。但是,在实际的项目中,new操作是少见的,假如,项目初期,有个类叫LogUtil,项目中几乎所有的类中都使用new实例化了这个类,然而有一天,项目组感觉这个名字不好,要改成LogsUtil……好,不就百十来个么,小意思,我一天就修改完了。然后第二天,冒着两个黑眼圈参加讨论的时候,项目组一致同意,将LogsUtil命名为LogsUtils……
简单工厂
上面的小例子中LogUtil如果是用简单工厂进行实例化,那么修改个类名也就是几秒钟的事:
//定制抽象产品接口public interface ILogUtil { }//定制具体产品子类public class LogUtil4DB implementsILogUtil { }public class LogUtil4File implementsILogUtil { }public class LogUtil implements ILogUtil {<spanstyle="white-space:pre"> </span>}//简单工厂类:它是一个具体的类,非接口或抽象类。其中一个重要的create()方法,利用if…else或switch开关创建所需产品,并返回。//其中create()方法通常是静态的,所以也称为静态工厂。public class LogUtilSimpleFactory {private static final String FORDB ="logutil4db";private static final String FORFILE ="logutil4file";private static final String LOGUTIL ="logutil"; public static ILogUtil create(String mark){ILogUtil obj = null;if(mark.equals(FORDB)){obj = new LogUtil4DB();}else if(mark.equals(FORFILE)){obj = new LogUtil4File();}else if(mark.equals(LOGUTIL)){obj = new LogUtil();}return obj;}}此时,只要修改LogUtil类的类名及工厂中的类名就可以了(当然,这个场景有点不合适,现在的编辑器大多可以在重命名类的时候将关联的地方一同修改,就这样理解)
工厂方法模式
工厂方法模式与简单工厂模式类似,但是较之多了一层:抽象工厂;还是拿上面的例子来说,产品没有变,但是工厂多了一个上层:总部(一般是接口后抽象类,规定具体的工厂应该实现哪些方法),比如,富士康有很多的加工部门,但是每个具体的加工厂肯定是有一个总部来告诉它加工什么,怎么加工就是具体工厂的事了。上面例子中IlogUtil及其子类不变,变的是工厂类:
//抽象工厂(总部;规定继承该抽象类的具体工厂的职能是create,产品是ILogUtil)public abstract classAbstractLogUtilFactory { publicabstract ILogUtil create();}//具体工厂,生产LogUtilpublic class LogUtilFactory extendsAbstractLogUtilFactory { @Overridepublic ILogUtil create() {return new LogUtil();}}//具体工厂,生产LogUtil4DBpublic class LogUtil4DBFactory extendsAbstractLogUtilFactory {@Overridepublic ILogUtil create() {return new LogUtil4DB();}}//具体工厂,生产LogUtil4Filepublic class LogUtil4FileFactory extendsAbstractLogUtilFactory { @Overridepublic ILogUtil create() {return new LogUtil4File();}}
抽象工厂模式
此模式与工厂方法模式类似,但是较之多了一些产品,而且,这些产品不是ILogUtil的子类,比如DataSource,那么抽象方法也有些变化:多了生产DataSource的抽象方法。然后具体的工厂都会去实现或继承这个方法,达到生产DataSource的目的,实际上就是将两个不同的工厂方法模式进行合并。代码与工厂方法模式类似:
//抽象工厂public abstract classAbstractLogUtilFactory { public abstract ILogUtil createLogUtil()<span style="white-space:pre"></span>public abstract IDataSource createDataSource();}
总结
简单工厂与工厂方法模式类似,都是单一产品系的,因为工厂类中只定义了一种返回值类型的方法,而抽象工厂模式中定义了多种返回值类型的方法(不同的方法,返回值不同),实际上就是将两个不同的工厂方法模式进行合并。
三种方式的关系简单表述为:由简单工厂衍生出工厂方法模式,通过将工厂类拆分成抽象工厂类(或接口)实现;由工厂方法模式衍生出抽象工厂模式,通过将两个不同产品系的工厂进行合并实现。
- Java设计模式—工厂设计模式
- Java设计模式—工厂方法模式&抽象工厂模式
- Java设计模式—工厂方法模式&抽象工厂模式
- JAVA设计模式——工厂模式
- java设计模式——工厂模式
- java设计模式——工厂模式
- Java设计模式——工厂模式
- Java设计模式——工厂模式
- java设计模式——工厂模式
- Java设计模式——工厂模式
- java设计模式——工厂模式
- java设计模式——工厂模式
- java设计模式——工厂模式
- java设计模式——工厂模式
- Java设计模式——工厂模式
- Java设计模式——工厂模式
- Java设计模式——工厂模式
- Java设计模式——工厂模式
- Swift中如何实现自定义Debug模式下打印Log
- DeepMind one shot learning 论文批注 One-Shot Generalization in Deep Generative Models
- phpstorm 整合apache服务器
- Servlet跳转到jsp不加载css样式
- Android Studio自动生成带系统签名的apk
- Java设计模式——工厂模式
- 校园网内利用Openwrt+PPTP实现全校范围内联网
- 求解偏微分方程开源有限元软件deal.II学习--Step 3
- 七招教你提升网站流量 绝对有效
- ios 中正则表达式
- Java的反射机制
- 求解偏微分方程开源有限元软件deal.II学习--Step 4
- webpack 问题记录
- Web Service的一个例子遇到的问题