设计模式学习之简单工厂+反射+配置文件

3.用反射+配置文件的方法重新实现大话设计模式课本上15章15.7的例题

问题分析:相比抽象工厂,用DataAccess类代替了工厂接口以及工厂类,再加上使用反射+配置文件的方式,可以做到不对编译好的程序作出改变就能修改数据库种类,客户端可以只是用DateAccess进行数据库访问实例的创建,达到了解耦的目的。

UML图:

package com.cmc;
//用户数据类
public class User {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

package com.cmc;
//部门数据类
public class Department {
	int id;
	String dept_name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDept_name() {
		return dept_name;
	}
	public void setDept_name(String dept_name) {
		this.dept_name = dept_name;
	}

}
package com.cmc;
//用户数据库操作的接口
public interface IUser {
	void insert(User user);
	User getUser(int id);
}
package com.cmc;
//部门数据库操作接口
public interface IDepartment {
    void insert(Department department);

	Department getDepartment(int id);
}
package com.cmc;
//在SqlServer中实现对用户数据库的操作
public class SqlserverUser implements IUser {

	public User getUser(int id) {
		System.out.println("在SQL Server中根据ID得到一条记录");
		return null;
	}

	public void insert(User u) {
		// TODO Auto-generated method stub
		System.out.println("在SQL Server 中给user表添加一条记录");

	}

}
package com.cmc;
//在Access中实现对用户数据库的操作
public class AccessUser implements IUser {

	public User getUser(int id) {
		System.out.println("在Access中根据ID得到一条记录");
		return null;
	}

	public void insert(User user) {
		// TODO Auto-generated method stub
		System.out.println("在Access中给user表添加一条记录");

	}

}
package com.cmc;

public class SqlserverDepartment implements IDepartment {

	public Department getDepartment(int id) {
		System.out.println("在SQL Server中根据ID得到一条记录");
		// TODO Auto-generated method stub
		return null;
	}

	public void insert(Department department) {
		// TODO Auto-generated method stub
		System.out.println("在SQL Server 中给Department表添加一条记录");

	}

}
package com.cmc;

public class AccessDepartment implements IDepartment {

	public Department getDepartment(int id) {
		System.out.println("在Access中根据ID得到一条记录");
		// TODO Auto-generated method stub
		return null;
	}

	public void insert(Department department) {
		// TODO Auto-generated method stub
		System.out.println("在Access中给Department表添加一条记录");
	}

}

package com.cmc;
//通过配置文件+反射对要创建的类进行切换
import java.io.IOException;
import java.util.Properties;

import config.RunMain;

public class DataAccess {
	public static IUser CreatUser(){
		IUser result = null;
		Properties prop = new Properties();
		try {
			prop.load(RunMain.class.getResourceAsStream("/com/cmc/datebase.properties"));
			Class db = Class.forName("com.cmc."+prop.getProperty("dbuser"));
			result = (IUser)db.newInstance();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}
	public static IDepartment CreatDepartment(){
		IDepartment result = null;
		Properties properties = new Properties();
		try {
			properties.load(RunMain.class.getResourceAsStream("/com/cmc/datebase.properties"));
			Class db = Class.forName("com.cmc."+properties.getProperty("dbdepartment"));
			result=(IDepartment)db.newInstance();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}
}

优点:

1.实现了组件的封装,然后让组件外部能真正面向接口编程。

2.通过简单工厂,实现了客户端和具体实现类的解耦。

缺点:不方便扩展子工厂,如果要增加oracle数据库,必须在DateAccess类中增加oracle的方法,在工厂中增加创建case,这一点不符合开闭原则。显然使用反射+配置文件可以解决后者。

时间: 2024-10-29 03:47:24

设计模式学习之简单工厂+反射+配置文件的相关文章

设计模式学习(二)-简单工厂模式

---恢复内容开始--- 简单工厂设计模式 简单工厂模式定义: 简单工厂设计模式又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 简单工厂主要分为如下几个角色 抽象产品(abstract product):为所有具体产品的抽象表现,一般为抽象类 具体产品(product):为抽象产品的具体实现 生成产品工厂(facto

[大话设计模式]学习笔记——简单工厂模式

序 说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西.我还要进BAT呢. 坚持每天学习新东西. 写代码时,意识到在代码结构上还是有点欠缺.赶紧补上. 纪录对设计模式的认识.小菜变大鸟.进攻BAT. 应用场景: 编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 这本书使用C#写的.已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418 常见的做法: 写一个方法封装计算机的功能,我们只需传参

Java设计模式学习记录-简单工厂模式、工厂方法模式

前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类)用来制造对象. 当一个人想要用手机的时候,需要自己创建手机然后来使用. 如下: public class IphoneX { public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } } public class I

设计模式学习笔记--简单工厂模式

背景: 在开发过程中,经常会创建大量的对象,创建对象后还会涉及到一系列的初始化操作,而我们也不一定会只是在创建对象之后马上就使用对象,而且如果初始化操作很复杂,代码看起来就会非常杂乱,如果有变动,所有的初始化操作都要进行修改,相当难以维护. 功能: 将对象的创建和使用分离开来,专门用于创建对象并初始化.并且进行扩展后,可以根据参数不同,创建不同的对象. 例子: // 设计模式Demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ

【C++深入浅出】设计模式学习之简单工厂

看大话设计模式中大牛对小菜的精辟点评,也写了一个计算器程序,并跟着点评一路改良,还是不过瘾,应用了类模板和异常捕捉机制重写了程序. 本文不能算干货,恰当的比方是饭前甜点,吃一口有点味.有点意思,总归太小不管饱. #include<stdlib.h> #include<stdio.h> #include<iostream> #include<Windows.h> #include<exception> using namespace std; te

设计模式学习之简单工厂模式

简单工厂模式,其实就是有一个静态的工厂方法,可以根据输出的条件返回对应的实例,然后再条用具体的实例的方法执行计算. 简单工厂模式相当与将条件判断都集中到了一个静态的工厂方法中.这样的好处是,执行具体计算任务的代码不需要再有很多的if判断,只专注于具体的计算.如果有新的计算需求,那么只需要增加相应的计算方法,并且在工厂方法中添加对应的入口条件就行了,对原有的计算方法没有任何影响. 一个简单计算器的实现例子如下 计算的类型接口: /** * @author wgyang * Create time:

设计模式学习一简单工厂模式

简单工厂模式 第一步, 创建父类A(抽象类),抽象方法,以及具体变量 第二步, 创建工厂类父类B,用于实现创建抽象类A 第三步, 创建要子类C,继承父类A,重载父类方法,写方法具体实现,以及变量具体赋值. 第四步, 创建工厂类D,继承工厂类父类B,用来创建具体实现的 子类C (相当于AC  是工厂里面的模板) (BD 是工厂里面生产的产品) 简单工厂模式,备忘

思想上移,行动下移——抽象工厂+反射+配置文件

从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏.虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单.可以说小菜只是帮我们理解了各个设计模式的用途以及有确定,真正的理解还需要我们自己动手实践. 为什么要用抽象工厂? 主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库.引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能