工厂模式
来源:互联网 发布:中国老师来了知乎 编辑:程序博客网 时间:2024/06/16 23:10
1.关于上一篇的简单工厂模式
简单工厂模式最大的缺点是当有新产品需要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务落逻辑,违背了开闭原则。且简单工厂模式中所有产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂。
2.工厂模式的定义
(1)工厂模式:定义一个用于创建对象的接口,让子类决定哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。是一种类创建型模式。
(2)工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而有其子类来具体实现工厂方法,创建具体的产品对象。
(3)Product(抽象产品)、ConcreteProduct(具体产品)、Factory(抽象工厂)、ConcreteFactory(具体工厂)
3.日志记录器的实现完整解决方案
// 日志记录器接口:抽象产品interface Logger { public void writeLog();} // 数据库日志记录器:具体产品class DatabaseLogger implements Logger { public void writeLog() { System.out.println("数据库日志记录"); }}; // 文件日志记录器:具体产品class FileLogger implements Logger { public void writeLog() { System.out.println("文件日志记录"); }}; // 日志记录器工厂接口:抽象工厂interface LoggerFactory { public Logger createLogger(); }// 数据库日志记录器工厂类:具体工厂class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger() { // 连接数据库,代码省略 // 创建数据库日志记录器对象 Logger logger = new DatabaseLogger(); // 初始化数据库日志记录器,代码省略 return logger; }}; // 文件日志记录器工厂类:具体工厂class FileLoggerFactory implements LoggerFactory { public Logger createLogger() { // 创建文件日志记录器对象 Logger logger = new FileLogger(); // 创建文件,代码省略 return logger; }}; class Client { public static void main(String args[]) { LoggerFactory factory; Logger logger; factory = new FileLoggerFactory(); logger = factory.createLogger(); logger.writeLog(); } };/*运行结果是:文件日志记录*/
4.引入重载方法后,代码的修改如下:
// (1)LoggerFactory修改为interface LoggerFactory { public Logger createLogger(); public Logger createLogger(String args); public Logger createLogger(Object obj);} // (2)具体工厂累修改如下class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger() { // 使用默认方法连接数据库,代码省略 Logger logger = new DatabaseLogger(); // 初始化数据库日志记录器,代码省略 return logger; }}; public Logger createLogger(String args) { // 使用参数args作为连接字符串来连接数据库,代码省略 Logger logger = new DatabaseLogger(); // 初始化数据库日志记录器,代码省略 return logger; }public logger createLogger(Object obj) { // 使用封装在参数obj中的连接字符串来连接数据库,代码省略 Logger logger = new DatabaseLogger(); // 使用封装在参数obj中的数据来初始化数据库日志记录器,代码省略 return logger; }
5.工厂方法的隐藏
对客户端隐藏工厂方法,工厂类中直接调用产品类的业务方法,客户端无需调用工厂方法来创建产品,直接通过工厂即可使用所创建的对象中的业务方法。
此时,代码修改为:
abstract class Loggerfactory { // 在工厂类中直接调用日志记录器类的业务方法writeLog(); public void writeLog() { Logger logger = this.createLogger(); logger.writeLog(); } public abstract Logger createLogger();}class Client { public static void main(String args[]) { LoggerFactory factory; factory = (LoggerFactory)XMLUtil.getBean(); factory.writeLog(); // 直接使用工厂对象来调用产品对象的业务方法 }};
6.工厂方法的使用场景
(1)客户端不知道其所需要的对象的类
(2)抽象工厂类通过其子类来指定创建哪个对象
0 0
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- virtualbox ubuntu 连接网络
- 设计模式之组合模式(Composite)
- [分享] Knockout.js 体验之旅
- MFC RichEdit控件
- LuminanceSource二维码生产
- 工厂模式
- JS中json对象和json字符串总结
- 初学网站制作,jquery中ajax的使用
- Android连接WIFI
- Java 7之基础 - 强引用、弱引用、软引用、虚引用
- 腾讯2017暑假实习生编程题有趣的数字
- Eclipse调用Spark on yarn问题及解决
- NodeJS基础
- 配置 Spring.NET