工厂模式SpringBean.docx
- 文档编号:8339927
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:11
- 大小:17.39KB
工厂模式SpringBean.docx
《工厂模式SpringBean.docx》由会员分享,可在线阅读,更多相关《工厂模式SpringBean.docx(11页珍藏版)》请在冰豆网上搜索。
工厂模式SpringBean
工厂模式、单例模式
1SpringBean工厂是IOC的核心。
考虑:
司机只能开一辆车,不管司机怎么new这个car,但允许只允许只是一辆车,单例模式的使用,car的产生过程由我自己来确定。
工厂自己生产自己的产品,不依赖于new,
1单例模式:
1.1始终只有一个对象
静态工厂方法:
在类内部产生对象的方法----都可叫工厂方法。
packagecom.bjsxt.dp.factory;
importjava.util.ArrayList;
importjava.util.List;
publicclassCarimplementsMoveable{
privatestaticCarcar=newCar();
//privatestaticList
PrivateCar(){}//外部不能new
publicstaticCargetInstance(){
returncar;
}
publicvoidrun(){
System.out.println("冒着烟奔跑中car.......");
}
}
packagecom.bjsxt.dp.factory;
publicclassTest{
publicstaticvoidmain(String[]args){
Carc=Car.getInstance();
Carc2=Car.getInstance();
if(c==c2)System.out.println("samecar");
m.run();
}
}
2简单工厂
1.2任意定制交通工具和其生产过程。
任意定制交通工具:
这个用到了接口的概念
packagecom.bjsxt.dp.factory;
publicinterfaceMoveable{
voidrun();
}
对于各种交通工具的生产过程也能都定制
packagecom.bjsxt.dp.factory;
publicclassCarFactoryextendsVehicleFactory{
publicMoveablecreate(){
returnnewCar();
}
}
工厂方法和单例模式有些冲突
3抽象工厂
getInstance方法,大多数都是静态工厂方法
在JDK之中很广泛的应用。
不仅开着车,还开着AK47,还吃着苹果。
手里面控制着产品非常非常多。
手里控制的一系列产品
控制着一系列产品的的替换,该怎么办,(套装)
工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准.
以开发项目的DAO层为例,在项目中客户的需求是常常变动的,临时更换数据库的需求也是常常发生的,那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.工厂模式常常用于创建多系列化的对象(如Orale系列,MySql系列)
1.首先定义相关接口(与平常的做法没什么区别)
Java代码
//角色表DAO接口
interfaceIroleDao{
voidinsert();
voidupdate();
}
//用户表DAO接口
interfaceIuserDao{
voidfind();
voiddelete();
}
//角色表DAO接口
interfaceIroleDao{
voidinsert();
voidupdate();
}
//用户表DAO接口
interfaceIuserDao{
voidfind();
voiddelete();
}2.不同的数据库有不同的SQL语句所以实现时必须分数据库来实现
Java代码
//用户表Oralce数据库DAO
classOracleuserDaoimplementsIuserDao{
publicvoiddelete(){
System.out.println("Oralce删除用户表数据");
}
publicvoidfind(){
System.out.println("Oralce查询用户表数据");
}
}
//用户表MySql数据库DAO
classMySqluserDaoimplementsIuserDao{
publicvoiddelete(){
System.out.println("MySql删除用户数据");
}
publicvoidfind(){
System.out.println("MySql查询用户数据");
}
}
//角色表Oracle数据库DAO
classOracleroleDaoimplementsIroleDao{
publicvoidinsert(){
System.out.println("Oralce对角色表插入数据");
}
publicvoidupdate(){
System.out.println("Oracle对角色表更新数据");
}
}
//角色表MySql数据库DAO
classMySqlroleDAOimplementsIroleDao{
publicvoidinsert(){
System.out.println("MySql对角色表插入数据");
}
publicvoidupdate(){
System.out.println("Mysql对角色表更新数据");
}
}
//用户表Oralce数据库DAO
classOracleuserDaoimplementsIuserDao{
publicvoiddelete(){
System.out.println("Oralce删除用户表数据");
}
publicvoidfind(){
System.out.println("Oralce查询用户表数据");
}
}
//用户表MySql数据库DAO
classMySqluserDaoimplementsIuserDao{
publicvoiddelete(){
System.out.println("MySql删除用户数据");
}
publicvoidfind(){
System.out.println("MySql查询用户数据");
}
}
//角色表Oracle数据库DAO
classOracleroleDaoimplementsIroleDao{
publicvoidinsert(){
System.out.println("Oralce对角色表插入数据");
}
publicvoidupdate(){
System.out.println("Oracle对角色表更新数据");
}
}
//角色表MySql数据库DAO
classMySqlroleDAOimplementsIroleDao{
publicvoidinsert(){
System.out.println("MySql对角色表插入数据");
}
publicvoidupdate(){
System.out.println("Mysql对角色表更新数据");
}
}
这里增加了一套DAO的实现(与平时有所不同,如果有10个数据库就要加上10种不同的实现,比较麻烦呀)
3.定义DAO工厂接口与实现(利用java反射机制生产出你需要的DAO如:
userDAO,roleDao)
Java代码
//DAO工厂
abstractclassDaoFactory{
publicstaticDaoFactorygetInstance(Stringclassname){
DaoFactorydao=null;
try{
dao=(DaoFactory)Class.forName(classname).newInstance();
}catch(Exceptione){
e.printStackTrace();
}
returndao;
}
abstractIuserDaogetuserdao();
abstractIroleDaogetroledao();
}
//Oralce工厂
classOracleFactoryextendsDaoFactory{
publicIroleDaogetroledao(){
returnnewOracleroleDao();
}
publicIuserDaogetuserdao(){
returnnewOracleuserDao();
}
}
//MySql工厂
classMysqlFactoryextendsDaoFactory{
publicIroleDaogetroledao(){
returnnewMySqlroleDAO();
}
publicIuserDaogetuserdao(){
returnnewMySqluserDao();
}
}
//DAO工厂
abstractclassDaoFactory{
publicstaticDaoFactorygetInstance(Stringclassname){
DaoFactorydao=null;
try{
dao=(DaoFactory)Class.forName(classname).newInstance();
}catch(Exceptione){
e.printStackTrace();
}
returndao;
}
abstractIuserDaogetuserdao();
abstractIroleDaogetroledao();
}
//Oralce工厂
classOracleFactoryextendsDaoFactory{
publicIroleDaogetroledao(){
returnnewOracleroleDao();
}
publicIuserDaogetuserdao(){
returnnewOracleuserDao();
}
}
//MySql工厂
classMysqlFactoryextendsDaoFactory{
publicIroleDaogetroledao(){
returnnewMySqlroleDAO();
}
publicIuserDaogetuserdao(){
returnnewMySqluserDao();
}
}
4.定义配置文件
Java代码
classConfig{
//Oralce
staticfinalStringORALCE="org.abc.OracleFactory";
staticfinalStringMYSQL="org.abc.MysqlFactory";
}
classConfig{
//Oralce
staticfinalStringORALCE="org.abc.OracleFactory";
staticfinalStringMYSQL="org.abc.MysqlFactory";
}
配置文件可以定义到XML中去(好处:
修改配置项之后不需要对JAVA文件进行编译.)
5.测试你的输出的DAO
Java代码
publicclassDao{
publicstaticvoidmain(String[]args){
DaoFactory.getInstance(Config.ORALCE).getroledao().insert();
DaoFactory.getInstance(Config.MYSQL).getroledao().insert();
}
}
publicclassDao{
publicstaticvoidmain(String[]args){
DaoFactory.getInstance(Config.ORALCE).getroledao().insert();
DaoFactory.getInstance(Config.MYSQL).getroledao().insert();
}
}
总结
使用条件:
一系列接口有一系列的实现
如上IuserDao、IroleDao等一系列的接口,他们可以有一系列的实现(Oracle方式、MySql方式)
OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
组成元素(以上面例子)
一系列接口:
IuserDao、IroleDao
一系列实现:
Oracle系列、MySql系列
系列工厂类:
Oracle系列工厂类、MySql系列工厂类(必须继承抽象工厂类)
抽象工厂类:
DaoFactory
4SpringBean工厂
产品系列方面
产品品种方面随意确定
为了调和,SpringBean工厂。
当你拿到任何类的子类的时候,
具体new什么请你写在配置文件里面把!
Property使用
Bean容器的模拟
1基于接口类型的任意定制!
2一定程度的生产过程的定制!
SpringIOCAOP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工厂 模式 SpringBean