设计模式之三:工厂方法模式—多态工厂的实现
来源:互联网 发布:log4j2 json 配置 编辑:程序博客网 时间:2024/05/22 05:26
简单工厂的严重问题:
当系统中需要引进新产品时,静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,违背了开闭原则
引入工厂方法模式:
针对不同的产品提供不同的工厂
定义:
定义一个用于创建对象的接口,让子类决定将 哪一个类实例化,工厂方法迷失让一个类实例化延迟到其子类,工厂方法模式又称为工厂模式(Factory Pattern),又课称作虚拟构造器模式(VIrtual Constructor Pattern)
一、工厂方法模式概述:
引入抽象工厂角色,可以是接口,也可以是抽象类或者具体类
代码:
interface Factory{
public Product factoryMethod();
}
class ConcreteFactory implements Factory{
public Product factoryMethod(){
return new COncreteFactory();
}
}
二、完整解决方案:
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 Factory{
public Logger createLogger(){
Logger logger =new DatabaseLogger();
return logger();
}
}
class FileLoggerFactory implements Factory{
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()
}
}
三、反射与配置文件
利用反射,返回xml中指定的对象,这样修改就不用修改源码了。
<?xml version="1.0"?>
<config>
<chartType>histogram</chartType>
</config>
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
class XMLUtil{
public static String getChartType(){
try{
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builer=dFactory.newDocumentBuilder();
Document doc;
doc=builer.parse(new File("config.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
}
Client端修改如下:
class Client{
public static void main(String[] args) {
LoggerFactory factory;
Logger logger;
factory=(LoggerFactory)XMLUtil.getBean;
logger=factory.createLogger();
logger.writeLog()
}
四、重载的工厂方法
使用工厂创建对象时,创建方法可以重载,使用args参数,obj参数,默认方式等多种参数来创建工厂
class DatabaseLoggerFactory implements Factory{
public Logger createLogger(){
Logger logger =new DatabaseLogger();
return logger();
}
public Logger createLogger(String args){
Logger logger =new DatabaseLogger();
return logger();
}
public Logger createLogger(Object obj){
Logger logger =new DatabaseLogger();
return logger();
}
}
五、工厂方法模式总结:
- 主要优点:
- 用火狐只需关心产品对应的工厂,无需关心创建细节,甚至具体产品的类的类名
- 多态,所有具体工厂类都具有同一个父类
- 加入新产品时,无需修改抽象工厂和抽象产品听的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,而指套添加一个具体工厂和具体产品就可以了,扩展性好
- 主要缺点:
- 添加新产品时徐太编写新的具体产品类
- 为了扩展性,需要引入抽象层,增加系统的抽象性和理解难度,增加了实现的难度
- 适用场景:
- 客户端不知道其所需要的对象的类
- 抽象工厂类通过其子类来指定创建那个对象
1 0
- 设计模式之三:工厂方法模式—多态工厂的实现
- SSH中用到的设计模式之三——工厂方法和抽象工厂
- GOF23设计模式之工厂方法模式的实现
- 设计模式之工厂方法模式的简单实现
- LoveLion老师的java设计模式之工厂三兄弟之工厂方法模式
- 设计模式之—工厂方法模式(FactoryMethod)-Java实现
- 设计模式——工厂模式之工厂方法
- 工厂方法模式-Factory Method Pattern 工厂三兄弟之工厂方法模式(一):日志记录器的设计
- 大话设计模式之简单工厂模式、抽象工厂模式及工厂方法模式的比较
- 大话设计模式之简单工厂模式、抽象工厂模式及工厂方法模式的比较
- 【设计模式之四:工厂模式对比】简单工厂、工厂方法和抽象工厂的区别
- 设计模式之三工厂
- 【设计模式】之三工厂
- 【设计模式之三工厂】
- 设计模式之三工厂
- 工厂三兄弟之工厂方法模式
- 工厂三兄弟之工厂方法模式
- 工厂三兄弟之工厂方法模式
- 清除行列
- 进程间通信之kill发送信号
- leetcode 71. Simplify Path
- 正确使用AFNetworking的SSL保证网络安全
- js复制文字信息
- 设计模式之三:工厂方法模式—多态工厂的实现
- Fresceo使用详解--用Java代码实现xml配置的效果(二)
- 对于分布式系统的理解
- Objective-C-iOS AppDelegate代理详解(启动,打开App,推送,通知)
- 常用开发工具----搜索工具
- 67. magento timezone
- 关于Android长按出现复制粘贴栏在顶部占位问题解决方法
- tengine和apache的区别
- [LeetCode]20. Valid Parentheses