首先要搞清楚的一点是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模式的主要意图:隐藏数据访问细节
模式其实就是加入了一个间接层