`

工厂模式与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;    
        }    
}  
   
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();
	}
}

 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();
	}

}

 目录结构



 

 

  • 大小: 21.5 KB
  • 大小: 20.8 KB
分享到:
评论
1 楼 明天的昨天 2009-09-23  
分析的很好,我转载了 十分感谢

相关推荐

    工厂模式dao模式操作数据库小例子

    在这个“工厂模式DAO模式操作数据库小例子”中,我们可以预期看到以下结构: 1. 数据库连接配置:通常会有一个配置类或.properties文件来存储数据库连接信息,如URL、用户名和密码。 2. 数据库接口:定义了对数据库...

    工厂模式很DAO模式实现购物车

    DAO模式主要用于数据库操作,它为数据访问提供了一个抽象层,使得业务逻辑与数据存储机制分离。在这个购物车应用中,DAO可能包含了获取、添加、更新和删除商品数据的方法。比如,一个`ProductDAO`类可以包含`...

    DAO设计模式(工厂+代理)

    DAO(Data Access Object)设计模式是一种在软件工程中常见的用于处理数据访问的模式,它将业务逻辑和数据访问逻辑分离,使得系统更加模块化,提高了代码的可复用性和可测试性。在这个“DAO设计模式(工厂+代理)”...

    DAO设计模式 DAO 设计模式 JAVA设计模式

    在Java开发中,DAO模式通常与其他设计模式结合使用,如工厂模式(创建DAO实例)、策略模式(根据策略选择不同的数据访问方式)、单例模式(管理全局唯一的DAO实例)等,以进一步提升系统的灵活性和可维护性。...

    MVC三层架构+DAO工厂模式进行JAVA WEB开发

    DAO模式用于封装对数据库的访问,减少业务层与数据库的直接耦合。而DAO工厂模式则进一步抽象了DAO的创建过程,提供了一种灵活的方式来实例化不同类型的DAO,以操作不同的数据表或数据源。 1. **DAO(数据访问对象)...

    《J2EE核心模式》(DAO模式)

    在实际的J2EE项目中,DAO模式常与Spring框架结合使用,Spring的DAO支持模块提供了对各种数据访问技术的抽象,比如JDBC、Hibernate、MyBatis等。此外,Spring的事务管理也与DAO模式密切相关,可以统一处理事务的开始...

    Struts+DAO+工厂模式+委托模式+值对象模式

    Struts、DAO、工厂模式、委托模式以及值对象模式是Java Web开发中常见的设计模式和技术栈,它们在构建高效、可维护的系统中扮演着重要角色。以下将详细阐述这些概念及其相互作用。 **Struts** 是一个开源的MVC...

    初步认识JAVA DAO设计模式

    DAO模式的核心思想是创建一个专门的接口或抽象类,用于执行对数据源的操作,这样业务组件就可以通过调用DAO接口来与数据库或其他数据存储进行交互,而无需直接了解这些底层的实现细节。 在J2EE环境中,DAO模式特别...

    核心J2EE模式-DAO(中文版)

    在Java企业级开发中,"核心J2EE模式-DAO(数据访问对象)"是一个至关重要的设计模式,它主要用于分离业务逻辑...在实际开发中,结合其他设计模式,如工厂模式和抽象工厂模式,可以进一步增强DAO模式的灵活性和适应性。

    Java DAO 设计模式.pdf

    - **易于测试**:由于DAO模式将数据访问逻辑与业务逻辑分离,因此可以更容易地为业务逻辑层编写单元测试。 **组成部分:** 1. **DAO接口**:定义了所有数据访问操作的抽象方法,如添加、删除、修改、查询等。 2. **...

    DAO设计模式辅助资料

    这个压缩包文件"DAO设计模式辅助资料"显然是为了帮助开发者更好地理解和应用DAO模式。下面,我们将深入探讨DAO设计模式的核心概念、实现方式以及它在实际开发中的应用。 DAO设计模式的基本思想是为数据库操作创建一...

    J2EE之DAO设计模式

    DAO设计模式可以通过采用抽象工厂和工厂方法模式来变得非常的灵活. 当底层数据存储实现不需要发生改变时,该策略可以使用工厂方法设计模式实现,来产生应用中所需的DAO. 当底层数据储存实现不得不发生变化的时候, ...

    DAO开发模式介绍.......

    在实际应用中,DAO模式可以与Service层配合,Service层调用DAO来执行数据操作,并处理业务逻辑。此外,现代的框架如Spring提供了对DAO的支持,通过依赖注入(DI)和面向切面编程(AOP),可以更方便地管理事务和...

    java设计模式:DAO模式.doc

    1. **DAO模式并非引入新功能**:DAO模式的本质是对数据访问的封装,它将数据操作的细节隐藏,使得业务逻辑层可以与数据存储的具体实现解耦。学习DAO模式,实际上是在学习如何利用设计模式解决特定问题的思维方式。 ...

    J2EE核心模式之DAO(简体中文)

    DAO模式常常与其他设计模式结合使用,如工厂模式用于创建DAO实例,策略模式用于动态选择不同的数据访问策略,以及代理模式来实现事务管理或缓存功能。 9. **最佳实践** 实现DAO时,应遵循一些最佳实践,如避免在...

    一个dao模式的实验报告

    在这个实验报告中,学生周媛娣通过Java Web开发实践,使用DAO模式实现了对数据库的操作,包括增加、查询等基本功能。 1. **DAO模式的理解**: DAO模式的核心思想是创建一个对象(DAO),该对象封装了对数据库的...

    DAO模式+抽象工厂模式+js

    总结一下,这个项目结合了DAO模式、抽象工厂模式和JavaScript技术,实现了多数据库连接的能力。在后端,通过DAO模式封装数据库操作,抽象工厂模式用于动态创建不同数据库的DAO实例;在前端,可能使用JavaScript进行...

    JSP_javabean_DAO_面向接口编程_工程模式.rar

    在本项目"JSP_javabean_DAO_面向接口编程_工程模式.rar"中,我们将探讨如何结合JavaBean、DAO(Data Access Object)、面向接口编程以及工厂模式来构建一个高效且可维护的Web应用程序。 首先,JavaBean是Java中的一...

    基于DAO工厂模式的三层架构示例项目源码

    在这个基于DAO工厂模式的三层架构示例项目中,我们将深入探讨每一层的功能以及DAO工厂模式在其中的作用。 **表现层(Presentation Layer)** 表现层是用户与系统交互的界面,它负责接收用户的输入,处理用户的请求...

Global site tag (gtag.js) - Google Analytics