工厂模式与DAO模式 工厂模式与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设计模式。

工厂模式

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. }  

 目录结构


猜你喜欢

转载自rongdmmap-126-com.iteye.com/blog/1433237