`
kobe学java
  • 浏览: 258476 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

工厂模式与DAO模式

 
阅读更多

      工厂模式是设计模式中较简单的模式,但在项目的开发过程中会常常用到它。下面分析下工厂模式,提出一种在项目中比较可行的工厂方法的实现。同时,结合单例模式,构建DAO设计模式。

工厂模式

1、工厂模式的组成

简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。它由三种角色组成:

抽象产品角色(Product):它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

      具体产品角色(Concert Product):工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

工厂类角色(Creator):这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

 

2、工厂模式UML图

 



 

 

 3、简单代码的实现

 

Java代码   收藏代码
  1. interface Fruit{      
  2.         public void grow();      
  3.         public void eat();      
  4. }  
  5.       
  6. pulbic class Apple implements Fruit{      
  7.         public void grow(){      
  8.                 System.out.println("苹果在生长...");      
  9.         }      
  10.         public void eat(){      
  11.                 System.out.println("吃苹果...");      
  12.         }      
  13. }    
  14.     
  15. public class Orange implements Fruit{      
  16.         public void grow(){      
  17.                 System.out.println("橘子在生长...");      
  18.         }      
  19.         public void eat(){      
  20.                 System.out.println("吃橘子...");      
  21.         }      
  22. }     
  23.    
  24. pulbic class Factory{      
  25.         public static Fruit getFruit(String name){      
  26.                 Fruit f = null;      
  27.                 if ("apple".equal(name)){      
  28.                         f = new Apple();      
  29.                 }else if (("orange".equal(name)){    ){      
  30.                         f = new Orange();      
  31.                 }      
  32.                 return f;      
  33.         }      
  34. }    
Java代码   收藏代码
  1.      
  2. public class Clinet{      
  3.         public static void main(String args[]){      
  4.                 Fruit f = Factory.getFruit(“apple”);      
  5.                 f.grow();      
  6.         }      
  7. }  

 

 

      从开闭原则上来分析下简单工厂模式。当增加了一种水果时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。那么对于产品部分来说,它是符合开闭原则的——对扩展开放、对修改关闭;但是工厂部分好像不太理想,因为每增加一一种水果,都要在工厂类中增加相应的商业逻辑和判断逻辑,这显然是违背开闭原则的。

      为了符合开闭原则,同时考虑以后代码的维护性,我们采用java的反射机制及propertie综合应用,使得配置与程序分离,程序的修改只与配置文件有关,某一部分的修改不影响其他程序。

 4、改造后的代码

Java代码   收藏代码
  1. /** 
  2.  * @author gao_jie 
  3.  * 
  4.  */  
  5. public interface Fruit {  
  6.     public void grow();      
  7.     public void eat();      
  8. }  
  9.   
  10. public class Apple implements Fruit {  
  11.     /* (non-Javadoc) 
  12.      * @see com.cvicse.Ifactory.Fruit#grow() 
  13.      */  
  14.     public void grow() {  
  15.         System.out.println("苹果在生长...");  
  16.     }  
  17.     /* (non-Javadoc) 
  18.      * @see com.cvicse.Ifactory.Fruit#eat() 
  19.      */  
  20.     public void eat() {  
  21.         System.out.println("吃苹果...");  
  22.     }  
  23. }  
  24.   
  25. public class Orange implements Fruit {  
  26.     /* (non-Javadoc) 
  27.      * @see com.cvicse.Ifactory.Fruit#grow() 
  28.      */  
  29.     public void grow() {  
  30.         System.out.println("橘子在生长...");  
  31.     }  
  32.   
  33.     /* (non-Javadoc) 
  34.      * @see com.cvicse.Ifactory.Fruit#eat() 
  35.      */  
  36.     public void eat() {  
  37.         System.out.println("吃橘子...");  
  38.     }  
  39. }  
  40.   
  41. public class Banana implements Fruit {  
  42.     /* (non-Javadoc) 
  43.      * @see com.cvicse.Ifactory.Fruit#grow() 
  44.      */  
  45.     public void grow() {  
  46.         System.out.println("香蕉在生长...");  
  47.     }  
  48.   
  49.     /* (non-Javadoc) 
  50.      * @see com.cvicse.Ifactory.Fruit#eat() 
  51.      */  
  52.     public void eat() {  
  53.         System.out.println("吃香蕉...");  
  54.     }  
  55. }  
  56.   
  57. public class FruitFactory {  
  58.     public static Fruit getFruit(String className) {  
  59.         Fruit f = null;  
  60.         try {  
  61.             // 采用类的反射机制生成实例  
  62.             f = (Fruit) Class.forName(className).newInstance();  
  63.         } catch (Exception e) {  
  64.             throw new ExceptionInInitializerError(e);  
  65.         }  
  66.         return f;  
  67.     }  
  68. }  
  69.   
  70. /** 
  71.  * @author gao_jie 
  72.  *  
  73.  */  
  74. public class PropertyOperate {  
  75.   
  76.     private Properties pro = null;  
  77.   
  78.     public PropertyOperate() {  
  79.         this.pro = new Properties();  
  80.         this.load();  
  81.     }  
  82.   
  83.     // 设置一个返回方法  
  84.     public Properties getPro() {  
  85.         return this.pro;  
  86.     }  
  87.     // 加载配置文件内容  
  88.     private void load() {  
  89.         try {  
  90.             // 文件流输入方式  
  91.             InputStream file = this.getClass().getClassLoader()  
  92.                     .getResourceAsStream("classInfor.properties");  
  93.             pro.load(file);  
  94.         } catch (IOException e) {  
  95.             // TODO Auto-generated catch block  
  96.             e.printStackTrace();  
  97.         }  
  98.     }    
  99. }  
  100.   
  101. classInfor.properties  
  102.   
  103. apple=com.cvicse.factory.Apple  
  104. orange=com.cvicse.factory.Orange  
  105. banana=com.cvicse.factory.Banana  
  106.   
  107. /** 
  108.  * @author gao_jie 
  109.  *  
  110.  */  
  111. public class Client {  
  112.   
  113.     /** 
  114.      * @param args 
  115.      */  
  116.     public static void main(String[] args) {  
  117.         // 获取文件名字路径  
  118.         Properties p = new PropertyOperate().getPro();  
  119.         // 进一步扩展,现在可以由用户自己输入要使用的类型  
  120.         Fruit f = FruitFactory.getFruit(p.getProperty(args[0]));  
  121.         f.grow();  
  122.     }  
  123. }  

 DAO模式

DAO设计模式是在项目开发过程中一个常见的设计模式,我们将在随后的文章中具体讲解,现在只贴出具体实现代码,以供参考。

典型实现代码

Java代码   收藏代码
  1. package com.cvice.dao;  
  2.   
  3. public interface UserDAO {  
  4.     public void insert();   //插入操作  
  5.     public void delet();    //删除操作  
  6. }  
  7.   
  8. package com.cvicse.dao.impl;  
  9.   
  10. import com.cvice.dao.UserDAO;  
  11.   
  12. /** 
  13.  * @author Administrator 
  14.  * 
  15.  */  
  16. public class UserDAOImpl implements UserDAO{  
  17.   
  18.     public void delet() {  
  19.         // TODO Auto-generated method stub  
  20.         System.out.println("删除记录成功");  
  21.     }  
  22.   
  23.     public void insert() {  
  24.         // TODO Auto-generated method stub  
  25.         System.out.println("插入记录成功");  
  26.     }  
  27. }  
  28.   
  29. package com.cvice.dao;  
  30.   
  31. import java.io.IOException;  
  32. import java.io.InputStream;  
  33. import java.util.Properties;  
  34.   
  35. /** 
  36.  * @author Administrator 
  37.  *  
  38.  */  
  39.   
  40. public class DaoFactory {  
  41.       
  42.     private static UserDAO userDao = null;//DAO层用户接口对象  
  43.     private static DaoFactory instance = new DaoFactory();  
  44.     private static Properties pro;//配置文件对象  
  45.   
  46.     private DaoFactory() {  
  47.         try {  
  48.             //初始化配置文件  
  49.             pro = new Properties();  
  50.             //采用类加载器方法读取配置文件信息到字节流对象,采用类加载灵活,不用写死  
  51.             InputStream inputStream = DaoFactory.class.getClassLoader()  
  52.                     .getResourceAsStream("db.properties");  
  53.             //加载字节流对象  
  54.             pro.load(inputStream);  
  55.         } catch (IOException e) {  
  56.             throw new ExceptionInInitializerError(e);  
  57.         }  
  58.     }  
  59.   
  60.     /** 
  61.      * 单例模式获取唯一实例 
  62.      * @return 
  63.      */  
  64.     public static DaoFactory getInstance() {   
  65.         return instance;  
  66.     }  
  67.   
  68.     /** 
  69.      * 根据配置文件的名字获取类的名字,采用反射机制获取其对象 
  70.      * @param Key 
  71.      * @return 
  72.      */  
  73.     public UserDAO getUserDAO(String Key) {  
  74.         try {  
  75.             String className=(String) pro.get(Key);  
  76.             userDao = (UserDAO) Class.forName(className).newInstance();  
  77.         } catch (InstantiationException e) {  
  78.             // TODO Auto-generated catch block  
  79.             e.printStackTrace();  
  80.         } catch (IllegalAccessException e) {  
  81.             // TODO Auto-generated catch block  
  82.             e.printStackTrace();  
  83.         } catch (ClassNotFoundException e) {  
  84.             // TODO Auto-generated catch block  
  85.             e.printStackTrace();  
  86.         }  
  87.         return userDao;  
  88.     }  
  89. }  
  90.   
  91. package com.cvicse.Test;  
  92.   
  93. import com.cvice.dao.DaoFactory;  
  94. import com.cvice.dao.UserDAO;  
  95.   
  96. /** 
  97.  * @author Administrator 
  98.  * 
  99.  */  
  100. public class DAOTest {  
  101.   
  102.     /** 
  103.      * @param args 
  104.      */  
  105.     public static void main(String[] args) {  
  106.         // TODO Auto-generated method stub  
  107.         UserDAO userDao=DaoFactory.getInstance().getUserDAO("userDao");  
  108.         userDao.delet();  
  109.     }  
  110.   
  111. }  

 目录结构


 

分享到:
评论

相关推荐

    工厂模式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