网站界面风格设计描述网站开发的实验心德
news/
2025/10/5 6:54:18/
文章来源:
网站界面风格设计描述,网站开发的实验心德,网站组建,新西兰网站后缀工厂方法模式
1#xff09;问题
简单工厂模式
当需要引入新产品时#xff0c;由于静态工厂方法通过所传入参数的不同来创建不同的产品#xff0c;需要修改工厂类的源代码。
2#xff09;概述
针对不同的产品提供不同的工厂#xff0c;系统提供一个与产品等级结构对应…工厂方法模式
1问题
简单工厂模式
当需要引入新产品时由于静态工厂方法通过所传入参数的不同来创建不同的产品需要修改工厂类的源代码。
2概述
针对不同的产品提供不同的工厂系统提供一个与产品等级结构对应的工厂等级结构。 3角色
Product抽象产品定义产品的接口是工厂方法模式所创建对象的超类型是产品对象的公共父类。ConcreteProduct具体产品实现了抽象产品接口某种类型的具体产品由专门的具体工厂创建具体工厂和具体产品之间一一对应。Factory抽象工厂在抽象工厂类中声明了工厂方法(Factory Method)用于返回一个产品。抽象工厂是工厂方法模式的核心所有创建对象的工厂类都必须实现该接口。ConcreteFactory具体工厂是抽象工厂类的子类实现了抽象工厂中定义的工厂方法并可由客户端调用返回一个具体产品类的实例。代码示例
interface Factory {public Product factoryMethod();
}class ConcreteFactory implements Factory {public Product factoryMethod() {return new ConcreteProduct();}
}注意
在实际使用时具体工厂类在实现工厂方法时除了创建具体产品对象之外还可以负责产品对象的初始化及一些资源和环境的配置工作例如连接数据库、创建文件等。
可以通过配置文件来存储具体工厂类 ConcreteFactory 的类名更换新的具体工厂时无须修改源代码系统扩展更为方便。
4案例-初始方案
问题
工厂类包含大量的if…else…代码导致维护和测试难度增大
系统扩展不灵活增加新类型的日志记录器必须修改静态工厂方法的业务逻辑。 5案例-重构后
Logger 接口充当抽象产品其子类 FileLogger 和 DatabaseLogger 充当具体产品LoggerFactory 接口充当抽象工厂其子类FileLoggerFactory 和 DatabaseLoggerFactory 充当具体工厂。 //日志记录器接口抽象产品
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();}
}6案例-使用反射和配置文件优化
在客户端代码中不再使用 new 关键字创建工厂对象而是将具体工厂类的类名存储在配置文件中通过读取配置文件获取类名字符串再使用 Java 的反射机制根据类名字符串生成对象。
//通过类名生成实例对象并将其返回
Class cClass.forName(String);
Object objc.newInstance();
return obj;配置文件 config.xml 存储具体工厂类类名
!— config.xml --
?xml version1.0?
configclassNameFileLoggerFactory/className
/configXML工具类
//工具类XMLUtil.java
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;public class XMLUtil {
//该方法用于从XML配置文件中提取具体类类名并返回一个实例对象public static Object getBean() {try {//创建DOM文档对象DocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();DocumentBuilder builder dFactory.newDocumentBuilder();Document doc; doc builder.parse(new File(config.xml)); //获取包含类名的文本节点NodeList nl doc.getElementsByTagName(className);Node classNodenl.item(0).getFirstChild();String cNameclassNode.getNodeValue();//通过类名生成实例对象并将其返回Class cClass.forName(cName);Object objc.newInstance();return obj;} catch(Exception e) {e.printStackTrace();return null;}}
}客户端代码
class Client {public static void main(String args[]) {LoggerFactory factory;Logger logger;factory (LoggerFactory)XMLUtil.getBean(); //getBean()的返回类型为Object需要进行强制类型转换logger factory.createLogger();logger.writeLog();}
}引入XMLUtil类和XML配置文件后增加新的日志记录方式只需如下步骤
新的日志记录器需要继承抽象日志记录器Logger
对应增加一个新的具体日志记录器工厂继承抽象日志记录器工厂LoggerFactory并实现其中的工厂方法createLogger()返回具体日志记录器对象
修改配置文件config.xml将新增的日志记录器工厂类的类名替换原有工厂类类名
编译新增的日志记录器类和日志记录器工厂类原有类库代码无须做任何修改。
7案例-使用方法重载和隐藏进行优化
1.方法重载 引入重载方法后抽象工厂 LoggerFactory 的代码如下
interface LoggerFactory {public Logger createLogger();public Logger createLogger(String args);public Logger createLogger(Object obj);
}具体工厂类 DatabaseLoggerFactory 的代码如下
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;}
}2.方法隐藏
为进一步简化客户端的使用还可以对客户端隐藏工厂方法
在工厂类中调用产品类的业务方法客户端无须调用工厂方法创建产品直接通过工厂即可使用所创建的对象中的业务方法。 抽象工厂类 LoggerFactory 的代码如下
//改为抽象类
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(); //直接使用工厂对象来调用产品对象的业务方法}
}8总结
1.优点
只需要关心所需产品对应的工厂无须关心创建细节无须知道具体产品类的类名。
在系统中加入新产品时无须修改抽象工厂和抽象产品提供的接口无须修改客户端也无须修改其他的具体工厂和具体产品只要添加一个具体工厂和具体产品就可以。
2.缺点
添加新产品时需要编写新的具体产品类还要提供与之对应的具体工厂类系统中类的个数将成对增加会给系统带来额外开销。
考虑到系统的可扩展性需要引入抽象层在客户端代码中均使用抽象层定义增加了系统的抽象性和理解难度且在实现时需要用到DOM、反射等技术增加了系统的实现难度。
3.适用场景
客户端不需要知道具体产品类的类名只需要知道对应的工厂即可。
抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中对于抽象工厂类只需要提供一个创建产品的接口而由其子类来确定具体要创建的对象利用面向对象的多态性和里氏代换原则在程序运行时子类对象将覆盖父类对象从而使得系统更容易扩展。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927932.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!