关于工厂和dao(j2ee设计模式和GOF的设计模式)

来源:互联网 发布:异域狂想曲 知乎 编辑:程序博客网 时间:2024/05/29 05:57

首先要搞清楚的一点是j2ee设计模式和GOF的设计模式是不一样的,dao是属于j2ee设计模式里面的一种,属于 GoF中策略模式的特例,j2ee的设计模式只是用在j2ee里面的

GOF的工厂模式就只有两种,分别为工厂方法抽象工厂其他的都不是,简单工厂不算是GOF里的模式

首先看看简单工厂,实际上简单工厂是工厂方法的一个特例,简单工厂是个大杂绘

简单工厂如图:


public class Client {

 public static void main(String[] args) {
  //取得海尔的电视
  //TV tv = TVFactory.createTV();
  
  //取得长虹的电视
  TV tv = TVFactory.createTV(TVFactory.CHANG_HONG);
  tv.turnOn();
 }
}

接下来说工厂方法:

 

工厂方法是把简单工厂又进行了一次抽象.海尔,长虹电视他不依赖于大工厂进行生产.海尔有海尔的工厂,长虹有长虹的工厂.但他们都继承自工厂的抽象.jdbc一样,他只是个抽象,他不依赖于到底是oracle还是mysql等.TVFactory factory=new TVFactory4HaiEr();//在这里客户端不依赖于具体的东西,而依赖于这个抽象的工厂,new TVFactory4HaiEr()就相当于我们用oracle的jdbc驱动,而new出什么来都是可以通过反射来得到的.

工厂方法的优点:支持OCP原则(开闭原则)

工厂方法应用的场景是只有一个产品,如电视,而如果有其他的产品如洗衣机就不行了,此时应用到另外一种叫抽象工厂的模式.

public class Client {

 public static void main(String[] args) {
  //取得海尔的工厂
  //TVFactory factory = new TVFactory4HaiEr();
  
  //取得长虹的工厂
  //TVFactory factory = new TVFactory4ChangHong();
  TVFactory factory = new TVFactory4HaiXin();
  TV tv = factory.createTV();
  tv.turnOn();
 }
}

抽象工厂:

抽象工厂是有几个系列的工厂,他不单是生产一个系列的产品,如一个工厂生产电视机和电脑,但型号固定,它支持ocp原则,对修改关闭,对扩展开放,如加入一个系列的工厂的话是这样的。

/**
 * 抽象工厂,主要创建两个系列的产品:
 *   1、Manager系列
 *   2、Dao系列产品
 * @author Administrator
 *
 */
public class BeanFactory {

 private static BeanFactory instance = new BeanFactory();
 
 private final String beansConfigFile = "beans-config.xml";
 
 //保存Service相关对象
 private Map serviceMap = new HashMap();
 
 //保存Dao相关对象
 private Map daoMap = new HashMap();
 
 private Document doc;
 
 private BeanFactory() {
  try {
   doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile));
  } catch (DocumentException e) {
   e.printStackTrace();
   throw new RuntimeException();
  }
 }
 
 public static BeanFactory getInstance() {
  return instance;
 }
 
 /**
  * 根据产品编号取得Service系列产品
  * @param beanId
  * @return
  */
 public synchronized Object getServiceObject(Class c){
  //如果存在相关对象实例,返回
  if (serviceMap.containsKey(c.getName())) {
   return serviceMap.get(c.getName());
  }
  Element beanElt = (Element)doc.selectSingleNode("//service[@id=\"" + c.getName() + "\"]");
  String className = beanElt.attributeValue("class");
  Object service = null;
  try {
   service = Class.forName(className).newInstance();
   
   //将创建好多的对象放到Map中
   serviceMap.put(c.getName(), service);
  } catch (Exception e) {
   throw new RuntimeException();
  }
  return service;
 }
 
 /**
  * 根据产品编号取得Service系列产品
  * @param beanId
  * @return
  */
 public synchronized Object getDaoObject(Class c){
  //如果存在相关对象实例,返回
  if (daoMap.containsKey(c.getName())) {
   return daoMap.get(c.getName());
  }
  Element beanElt = (Element)doc.selectSingleNode("//dao[@id=\"" + c.getName() + "\"]");
  String className = beanElt.attributeValue("class");
  Object dao = null;
  try {
   dao = Class.forName(className).newInstance();
   
   //将创建好多的对象放到Map中
   daoMap.put(c.getName(), dao);
  } catch (Exception e) {
   throw new RuntimeException();
  }
  return dao;
 }
 
 public static void main(String[] args) {
  //ItemManager itemManager = (ItemManager)BeanFactory.getInstance().getServiceObject("itemManager");
  //System.out.println(itemManager);
  //ItemDao itemDao = (ItemDao)BeanFactory.getInstance().getDaoObject("com.bjpowernode.drp.basedata.dao.ItemDao");
  ItemDao itemDao = (ItemDao)BeanFactory.getInstance().getDaoObject(ItemDao.class);
  System.out.println(itemDao);
 }
}

 

Dao模式:

Dao(Data Access Object)数据访问对象,属于J2EE设计模式。属于 GoF中策略模式的特例,用一个 Dao 接口隐藏了持久化操作的细节,这样使用这个模式的业务对象,无需了解底层的数据库持久化知识了。区分“业务逻辑”和“持久化逻辑”通常是有好处的,业务逻辑通常关心的是应用程序的核心流程和业务规则,持久化逻辑关注的是如
何访问和操作持久化数据。换句话说:把业务逻辑和规则放在一边,与持久化相关的问题放在一边。

Dao模式的主要意图:隐藏数据访问细节

 

模式其实就是加入了一个间接层

原创粉丝点击