- 浏览: 228193 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
forcer521:
非常好,收了!!
jquery控制表格奇偶行的颜色变化 及鼠标移动的高亮显示 -
fnet:
Ubuntu 真简单,但是我的服务器貌似装不上
ubuntu9.10 快速搭建简易的ftp服务器 -
rockman:
写的很详细。
ubuntu9.10 快速搭建简易的ftp服务器 -
明天的昨天:
dengli19881102 写道还有INDEX_CATEGO ...
TreePanel checkbox 联动 -
明天的昨天:
dengli19881102 写道if (node.paren ...
TreePanel checkbox 联动
关键字: io流、反射机制、properties、dao、单例
工厂模式是设计模式中较简单的模式,但在项目的开发过程中会常常用到它。下面分析下工厂模式,提出一种在项目中比较可行的工厂方法的实现。同时,结合单例模式,构建DAO设计模式。
工厂模式
1、工厂模式的组成
简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。它由三种角色组成:
抽象产品角色(Product): 它一般是具体产品继承的父类或者实现的接口。在 java 中由接口或者抽象类来实现。
具体产品角色(Concert Product): 工厂类所创建的对象就是此角色的实例。在 java 中由一个具体类实现。
工厂类角色(Creator): 这是本模式的核心,含有一定的商业逻辑和判断逻辑。在 java 中它往往由一个具体类实现。
2、工厂模式UML图
3、简单代码的实现
- interface Fruit{
- public void grow();
- public void eat();
- }
- pulbic class Apple implements Fruit{
- public void grow(){
- System.out.println("苹果在生长..." );
- }
- public void eat(){
- System.out.println("吃苹果..." );
- }
- }
- public class Orange implements Fruit{
- public void grow(){
- System.out.println("橘子在生长..." );
- }
- public void eat(){
- System.out.println("吃橘子..." );
- }
- }
- pulbic class Factory{
- public static Fruit getFruit(String name){
- Fruit f = null ;
- if ( "apple" .equal(name)){
- f = new Apple();
- }else if (( "orange" .equal(name)){ ){
- f = new Orange();
- }
- return f;
- }
- }
interface Fruit{ public void grow(); public void eat(); } pulbic class Apple implements Fruit{ public void grow(){ System.out.println("苹果在生长..."); } public void eat(){ System.out.println("吃苹果..."); } } public class Orange implements Fruit{ public void grow(){ System.out.println("橘子在生长..."); } public void eat(){ System.out.println("吃橘子..."); } } pulbic class Factory{ public static Fruit getFruit(String name){ Fruit f = null; if ("apple".equal(name)){ f = new Apple(); }else if (("orange".equal(name)){ ){ f = new Orange(); } return f; } }
- public class Clinet{
- public static void main(String args[]){
- Fruit f = Factory.getFruit(“apple”);
- f.grow();
- }
- }
public class Clinet{ public static void main(String args[]){ Fruit f = Factory.getFruit(“apple”); f.grow(); } }
从开闭原则上来分析下简单工厂模式。当增加了一种水果时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被 客户使用了。那么对于产品部分来说,它是符合开闭原则的——对扩展开放、对修改关闭;但是工厂部分好像不太理想,因为每增加一一种水果,都要在工厂类中增 加相应的商业逻辑和判断逻辑,这显然是违背开闭原则的。
为了符合开闭原则,同时考虑以后代码的维护性,我们采用java的反射机制及propertie综合应用,使得配置与程序分离,程序的修改只与配置文件有关,某一部分的修改不影响其他程序。
4、改造后的代码
- /**
- * @author gao_jie
- *
- */
- public interface Fruit {
- public void grow();
- public void eat();
- }
- public class Apple implements Fruit {
- /* (non-Javadoc)
- * @see com.cvicse.Ifactory.Fruit#grow()
- */
- public void grow() {
- System.out.println("苹果在生长..." );
- }
- /* (non-Javadoc)
- * @see com.cvicse.Ifactory.Fruit#eat()
- */
- public void eat() {
- System.out.println("吃苹果..." );
- }
- }
- public class Orange implements Fruit {
- /* (non-Javadoc)
- * @see com.cvicse.Ifactory.Fruit#grow()
- */
- public void grow() {
- System.out.println("橘子在生长..." );
- }
- /* (non-Javadoc)
- * @see com.cvicse.Ifactory.Fruit#eat()
- */
- public void eat() {
- System.out.println("吃橘子..." );
- }
- }
- public class Banana implements Fruit {
- /* (non-Javadoc)
- * @see com.cvicse.Ifactory.Fruit#grow()
- */
- public void grow() {
- System.out.println("香蕉在生长..." );
- }
- /* (non-Javadoc)
- * @see com.cvicse.Ifactory.Fruit#eat()
- */
- public void eat() {
- System.out.println("吃香蕉..." );
- }
- }
- public class FruitFactory {
- public static Fruit getFruit(String className) {
- Fruit f = null ;
- try {
- // 采用类的反射机制生成实例
- f = (Fruit) Class.forName(className).newInstance();
- } catch (Exception e) {
- throw new ExceptionInInitializerError(e);
- }
- return f;
- }
- }
- /**
- * @author gao_jie
- *
- */
- public class PropertyOperate {
- private Properties pro = null ;
- public PropertyOperate() {
- this .pro = new Properties();
- this .load();
- }
- // 设置一个返回方法
- public Properties getPro() {
- return this .pro;
- }
- // 加载配置文件内容
- private void load() {
- try {
- // 文件流输入方式
- InputStream file = this .getClass().getClassLoader()
- .getResourceAsStream("classInfor.properties" );
- pro.load(file);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- classInfor.properties
- apple=com.cvicse.factory.Apple
- orange=com.cvicse.factory.Orange
- banana=com.cvicse.factory.Banana
- /**
- * @author gao_jie
- *
- */
- public class Client {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 获取文件名字路径
- Properties p = new PropertyOperate().getPro();
- // 进一步扩展,现在可以由用户自己输入要使用的类型
- Fruit f = FruitFactory.getFruit(p.getProperty(args[0 ]));
- f.grow();
- }
- }
/** * @author gao_jie * */ public interface Fruit { public void grow(); public void eat(); } public class Apple implements Fruit { /* (non-Javadoc) * @see com.cvicse.Ifactory.Fruit#grow() */ public void grow() { System.out.println("苹果在生长..."); } /* (non-Javadoc) * @see com.cvicse.Ifactory.Fruit#eat() */ public void eat() { System.out.println("吃苹果..."); } } public class Orange implements Fruit { /* (non-Javadoc) * @see com.cvicse.Ifactory.Fruit#grow() */ public void grow() { System.out.println("橘子在生长..."); } /* (non-Javadoc) * @see com.cvicse.Ifactory.Fruit#eat() */ public void eat() { System.out.println("吃橘子..."); } } public class Banana implements Fruit { /* (non-Javadoc) * @see com.cvicse.Ifactory.Fruit#grow() */ public void grow() { System.out.println("香蕉在生长..."); } /* (non-Javadoc) * @see com.cvicse.Ifactory.Fruit#eat() */ public void eat() { System.out.println("吃香蕉..."); } } public class FruitFactory { public static Fruit getFruit(String className) { Fruit f = null; try { // 采用类的反射机制生成实例 f = (Fruit) Class.forName(className).newInstance(); } catch (Exception e) { throw new ExceptionInInitializerError(e); } return f; } } /** * @author gao_jie * */ public class PropertyOperate { private Properties pro = null; public PropertyOperate() { this.pro = new Properties(); this.load(); } // 设置一个返回方法 public Properties getPro() { return this.pro; } // 加载配置文件内容 private void load() { try { // 文件流输入方式 InputStream file = this.getClass().getClassLoader() .getResourceAsStream("classInfor.properties"); pro.load(file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } classInfor.properties apple=com.cvicse.factory.Apple orange=com.cvicse.factory.Orange banana=com.cvicse.factory.Banana /** * @author gao_jie * */ public class Client { /** * @param args */ public static void main(String[] args) { // 获取文件名字路径 Properties p = new PropertyOperate().getPro(); // 进一步扩展,现在可以由用户自己输入要使用的类型 Fruit f = FruitFactory.getFruit(p.getProperty(args[0])); f.grow(); } }
DAO模式
DAO设计模式是在项目开发过程中一个常见的设计模式,我们将在随后的文章中具体讲解,现在只贴出具体实现代码,以供参考。
典型实现代码
- package com.cvice.dao;
- public interface UserDAO {
- public void insert(); //插入操作
- public void delet(); //删除操作
- }
- package com.cvicse.dao.impl;
- import com.cvice.dao.UserDAO;
- /**
- * @author Administrator
- *
- */
- public class UserDAOImpl implements UserDAO{
- public void delet() {
- // TODO Auto-generated method stub
- System.out.println("删除记录成功" );
- }
- public void insert() {
- // TODO Auto-generated method stub
- System.out.println("插入记录成功" );
- }
- }
- package com.cvice.dao;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Properties;
- /**
- * @author Administrator
- *
- */
- public class DaoFactory {
- private static UserDAO userDao = null ; //DAO层用户接口对象
- private static DaoFactory instance = new DaoFactory();
- private static Properties pro; //配置文件对象
- private DaoFactory() {
- try {
- //初始化配置文件
- pro = new Properties();
- //采用类加载器方法读取配置文件信息到字节流对象,采用类加载灵活,不用写死
- InputStream inputStream = DaoFactory.class .getClassLoader()
- .getResourceAsStream("db.properties" );
- //加载字节流对象
- pro.load(inputStream);
- } catch (IOException e) {
- throw new ExceptionInInitializerError(e);
- }
- }
- /**
- * 单例模式获取唯一实例
- * @return
- */
- public static DaoFactory getInstance() {
- return instance;
- }
- /**
- * 根据配置文件的名字获取类的名字,采用反射机制获取其对象
- * @param Key
- * @return
- */
- public UserDAO getUserDAO(String Key) {
- try {
- String className=(String) pro.get(Key);
- userDao = (UserDAO) Class.forName(className).newInstance();
- } catch (InstantiationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return userDao;
- }
- }
- package com.cvicse.Test;
- import com.cvice.dao.DaoFactory;
- import com.cvice.dao.UserDAO;
- /**
- * @author Administrator
- *
- */
- public class DAOTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- UserDAO userDao=DaoFactory.getInstance().getUserDAO("userDao" );
- userDao.delet();
- }
- }
package com.cvice.dao; public interface UserDAO { public void insert(); //插入操作 public void delet(); //删除操作 } package com.cvicse.dao.impl; import com.cvice.dao.UserDAO; /** * @author Administrator * */ public class UserDAOImpl implements UserDAO{ public void delet() { // TODO Auto-generated method stub System.out.println("删除记录成功"); } public void insert() { // TODO Auto-generated method stub System.out.println("插入记录成功"); } } package com.cvice.dao; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * @author Administrator * */ public class DaoFactory { private static UserDAO userDao = null;//DAO层用户接口对象 private static DaoFactory instance = new DaoFactory(); private static Properties pro;//配置文件对象 private DaoFactory() { try { //初始化配置文件 pro = new Properties(); //采用类加载器方法读取配置文件信息到字节流对象,采用类加载灵活,不用写死 InputStream inputStream = DaoFactory.class.getClassLoader() .getResourceAsStream("db.properties"); //加载字节流对象 pro.load(inputStream); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } /** * 单例模式获取唯一实例 * @return */ public static DaoFactory getInstance() { return instance; } /** * 根据配置文件的名字获取类的名字,采用反射机制获取其对象 * @param Key * @return */ public UserDAO getUserDAO(String Key) { try { String className=(String) pro.get(Key); userDao = (UserDAO) Class.forName(className).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return userDao; } } package com.cvicse.Test; import com.cvice.dao.DaoFactory; import com.cvice.dao.UserDAO; /** * @author Administrator * */ public class DAOTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub UserDAO userDao=DaoFactory.getInstance().getUserDAO("userDao"); userDao.delet(); } }
目录结构
相关推荐
标题 "JavaEye博客文章——深入理解HTTP你的游戏" 这篇博客文章是关于深入理解HTTP协议的,作者通过"你的游戏"这个实例,详细讲解了HTTP在实际应用中的运作机制,特别是对于游戏开发而言的重要知识点。HTTP(超文本...
-- 配置集群的时候,要用到,在这篇文章:“apache+tomcat集群、负载均衡及session复制”里的第三条(http://jiajun.javaeye.com/admin/blogs/278586) --> <distributable/> <!-- context-param 元素用来设定...
CSDN是国内知名的IT技术社区,其Java专区汇聚了大量的技术博客、问答和项目资源。无论是Java基础还是高级主题,这里都有丰富的资料可供参考,是Java学习者的宝库。 ### 7. Developer Resources for Java Technology...
http://peterwei.javaeye.com/blog/968815 Ubuntu10下JDK1.6安装 http://peterwei.javaeye.com/blog/968758 Ubuntu10下Tomcat7安装 http://peterwei.javaeye.com/blog/968774 Ubuntu10下Eclipse3.6安装 ...
- **CodingNow**(http://blog.codingnow.com/): 技术博客平台,汇集了许多知名技术博主的文章。 - **Tech.Sina**(http://tech.sina.com.cn/): 新浪科技频道,提供最新的科技新闻和技术动态。 ### 3. 专项技术...
8. **Mingkg21博客(http://mingkg21.javaeye.com/category/53645)**:虽然JavaEye已关闭,但其存档的博客仍提供了Android开发的宝贵资源。 9. **Yaohuiji博客(http://android.yaohuiji.com/archives/672)**:...
- Maven的中文手册可参考[http://www.juvenxu.com/mvn-def-guide/](http://www.juvenxu.com/mvn-def-guide/)和[http://juvenshun.javaeye.com/5](http://juvenshun.javaeye.com/5)。 **5. Maven项目导入Eclipse** ...
3. **Hadoop部署与升级**:`http://www.slideshare.net/steve_l/dynamic-hadoop-clusters`, `http://zkl-1987.javaeye.com/blog/365172`, `http://www.javaeye.com/topic/365172` - 提供了Hadoop集群部署的最佳实践...
- 1.1 final 版: [http://fins.javaeye.com/blog/54265](http://fins.javaeye.com/blog/54265) - 1.1 RC1 版: [http://fins.javaeye.com/blog/51068](http://fins.javaeye.com/blog/51068) - 1.0 RC1 版: ...
6. **HTML5和CSS3资源分享**([http://www.javaeye.com/news/16684-html5-css3](http://www.javaeye.com/news/16684-html5-css3)) - 分享了一些高质量的HTML5和CSS3资源链接,有助于开发者扩展视野。 7. **CSS3...
### Java学习资源与工具 #### 一、在线学习平台与社区 **1.1 ChinaJavaWorld** - **网址**: http://www.chinajavaworld.com/index.jsp - **简介**: 该网站提供了丰富的Java技术文章、教程以及开发者的交流论坛,...
http://comsci.javaeye.com/ JWFD工作流设计器(带引擎算法)的源代码包, 实在不好意思,这个包的资源文件缺失了,导致编译时报错,经过反馈, 修改了这个问题,在资源中新增加下载,本下载停止使用,非常抱歉 请...
5. **JavaEye([http://www.javaeye.com/](http://www.javaeye.com/))** - **特点**:这曾经是Java开发者非常活跃的一个社区,虽然现在已不再更新,但其历史资料仍然具有很高的参考价值。 - **适用人群**:适合...
### Java学习资源与工具 #### 一、Java学习网站 对于初学者以及有一定经验的开发者而言,找到合适的Java学习资源是十分重要的。以下是一些知名的Java学习网站: 1. **Java中文世界论坛**...