工厂方法模式(JAVA反射)
模式动机


模式定义
模式结构

模式分析
public abstract class PayMethodFactory
{
public abstract AbstractPay getPayMethod();
}
具体工厂类代码:
public class CashPayFactory extends PayMethodFactory
{
public AbstractPay getPayMethod()
{
return new CashPay();
}
}
客户类代码片段:
PayMethodFactory factory;
AbstractPay payMethod;
factory=new CashPayFactory();
payMethod =factory.getPayMethod();
payMethod.pay();
<?xml version="1.0"?>
<config>
<className>CashPayFactory</className>
</config>
//创建一个字符串类型的对象
Class c = Class.forName(“String”);
Object obj = c.newInstance();
return obj;
工具类XMLUtil代码片段:
//创建DOM文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.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;
模式实例与解析

实例代码(JAVA):
//抽象产品类 TV
public interface TV
{
public void play();
} //具体产品类 HaierTV
public class HaierTV implements TV
{
public void play()
{
System.out.println("海尔电视机播放中......");
}
} //具体产品类 HisenseTV
public class HisenseTV implements TV
{
public void play()
{
System.out.println("海信电视机播放中......");
}
} //抽象工厂类 TVFactory
public interface TVFactory
{
public TV produceTV();
} //具体工厂类 HaierTVFactory
public class HaierTVFactory implements TVFactory
{
public TV produceTV()
{
System.out.println("海尔电视机工厂生产海尔电视机...");
return new HaierTV();
}
} //具体工厂类 HisenseTVFactory
public class HisenseTVFactory implements TVFactory
{
public TV produceTV()
{
System.out.println("海信电视机工厂生产海信电视机...");
return new HisenseTV();
}
} //配置文件 config.xml
<?xml version="1.0"?>
<config>
<className>HisenseTVFactory</className>
</config> //通过反射获得具体工厂的实例 XMLUtil
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
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.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
public class Client
{
public static void main(String args[])
{
try
{
TV tv;
TVFactory factory;
factory=(TVFactory)XMLUtil.getBean();
tv=factory.produceTV();
tv.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
实例代码(C++):
// 工厂方法模式
#include <iostream>
using namespace std; //抽象产品TV
class TV
{
public:
virtual void play() = 0;
}; //具体产品类 HaierTV
class HaierTV:public TV
{
public:
void play() override
{
cout << "海尔电视机播放中..." << endl;
}
}; //具体产品类HisenseTV
class HisenseTV:public TV
{
public:
void play() override
{
cout << "海信电视机播放中..." << endl;
}
}; //抽象工厂类 TVFactory
class TVFactory
{
public:
virtual TV* productTV() = 0;
}; //具体工厂类 HaierTVFactory
class HaierTVFactory:public TVFactory
{
public:
TV* productTV() override
{
cout << "海尔工厂生产海尔电视机..." << endl;
return new HaierTV();
}
}; //具体工厂类 HisenseTVFactory
class HisenseTVFactory:public TVFactory
{
public:
TV* productTV() override
{
cout << "海信工厂生产海信电视机..." << endl;
return new HisenseTV();
}
}; //客户端
int main()
{
TV* tv = nullptr;
TVFactory* factory = nullptr;
factory = new HaierTVFactory();
tv = factory->productTV();
tv->play();
factory = new HisenseTVFactory();
tv = factory->productTV();
tv->play();
return 0;
}
运行结果:

模式优缺点
模式适用环境
模式应用

(2) Java消息服务JMS(Java Messaging Service) :
//使用上下文和JNDI得到连接工厂的引用,ctx是上下文Context类型的对象
QueueConnectionFactory qConnFact=(QueueConnectionFactory)ctx.lookup("cfJndi");
//使用连接工厂创建一个连接
QueueConnection qConn=qConnFact.createQueueConnection();
//使用连接创建一个会话
QueueSession qSess=qConn.createQueueSession(false,javax.jms.QueueSession. AUTO_ACKNOWLEDGE);
//使用上下文和JNDI得到消息队列的引用
Queue q=(Queue)ctx.lookup("myQueue");
//使用连接创建一个需要发送的消息类型的实例
QueueSender qSend=qSess.createSender(q);
System.out.println("开始发送消息......");
(3) JDBC中的工厂方法:
Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=DB;user=sa;password=");
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery("select * from UserInfo");
模式扩展
工厂方法模式(JAVA反射)的更多相关文章
- 设计模式之第1章-工厂方法模式(Java实现)
设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...
- 工厂方法模式--java代码实现
工厂方法模式 工厂方法模式,对简单工厂模式进行了升级.我们将水果园比作一个工厂,在简单工厂模式下,水果园是一个具体的工厂,直接用来生产各种各样的水果.那么在工厂方法模式下,水果园是一个抽象工厂,那么苹 ...
- 设计模式之工厂方法模式(Java实现)
“我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~).“抽象工厂模式,赶紧的自我介绍,工厂方法模式 ...
- FactoryMethodPattern(工厂方法模式)-----Java/.Net
也就是工厂方法(FactoryMethod)模式允许将产品类的实例化推迟到具体的创建者子类,由创建者子类决定实例化哪一个产品类.我们同样以汽车的生产作为讲解该模式的例子,因为汽车生产从宏观上来说也是特 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式3:工厂方法模式
工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...
- 工厂方法模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次 ...
- java之设计模式工厂三兄弟之工厂方法模式
[学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
随机推荐
- HBase Hive
Hbase数据管理 Hbase就是Hadoop database Hbase是列式数据库 因此Hbase特别适合寻找按照时间排序寻找Top n的场景 Hive数据管理 基于 Hadoop 文件系统的数 ...
- yii2 分页
基于数据提供者 public function actionIndex() { $page = Yii::$app->get('page', 0); $modelClass = $this-&g ...
- Java判断一个字符串是否有中文
Java判断一个字符串是否有中文一般情况是利用Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是其实这个区间来判断中文不是非常精确,因为有些中文的标点符号比 ...
- .net Core 配置Centos守护进程Supervisor
声明: 博客引用来源:https://blog.csdn.net/qq_37997978/article/details/83311177建议看原版,更为详细 介绍: Supervisor( http ...
- GitBook的使用方式,快速创建网页文档
环境需求:node npm 得装好 ----------------------------------- 我一开始不知道得先装gitbook-cli 先执行了 npm install gitbook ...
- Pandownload---windows下几乎无敌的网盘下载神器
近几天光顾着mac了,今天咱来聊聊Windows. 这个就不多说了,直接贴图. 网页版截图. 电脑版截图. 网页版2020.2.1的时候是失效的,别问我为什么不现在测试,用不着. 不用担心不知道密码, ...
- Python 查看函数属于哪个模块
help(函数名)出现的信息里包含了所在模块
- python调用HEG工具批量处理MODIS数据
下面的代码主要用于使用python语言调用NASA官方的MODIS处理工具HEG进行投影坐标转换与重采样批量处理 主要参考 HEG的用户手册:https://newsroom.gsfc.nasa.go ...
- vue老项目升级vue-cli3.0
第一步我们卸载全局的vue2.0然后: 打开命令行 输入npm install -g @vue/cli-init 这个就是会安装全局的vue3.0版本.安装好之后我们也可以vue -V查看当前vu ...
- 一看就会一做就废系列:说说 RECOVER UNTIL CANCEL
这里是:一看就会,一做就废系列 数据库演示版本为 19.3 (12.2.0.3) 该系列涉及恢复过程中使用的 5 个语句: 1. recover database 2. recover databas ...