`

抽象工厂-比较经典

阅读更多

抽象工厂是一个不错的设计模式,现在利用它实现数据层的高移植性,只需改动 AbstractDaoFactory.properties一个文件:

以下是项目的结构图:


biz业务层,dao数据接口层,mysql和Oracle是数据层的具体实现,factory工厂层,有3个配置文件,命名规则是根据工厂名字命名的,为什么呢,看了代码就知道了。现在业务层只依赖数据接口层和抽象工厂,不和实际的数据层实现发生依赖。在这里面抽象工厂还扮演着模板角色,核心代码如下:

AbstractDaoFactory类:

package org.forever.factory;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public abstract class AbstractDaoFactory {
	
	private static AbstractDaoFactory instance; 
	private static Map<String, Object> map = new HashMap<String, Object>();
	private static Properties properties = new Properties();
	private static Properties daoproperties = new Properties();
	
	private static AbstractDaoFactory getInstance(){
		if(instance==null){
			synchronized (AbstractDaoFactory.class) {
				if(instance==null){
					String name = AbstractDaoFactory.class.getSimpleName()+".properties";
					ClassLoader classLoader = AbstractDaoFactory.class.getClassLoader();
					InputStream inputStream = classLoader.getResourceAsStream(name);
					try {
						properties.load(inputStream);
						String daoFactoryClass = properties.getProperty(AbstractDaoFactory.class.getName());
						instance = (AbstractDaoFactory)Class.forName(daoFactoryClass).newInstance();
						daoproperties.load(
								classLoader.getResourceAsStream(instance.getClass().getSimpleName()+".properties")
						);
						
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				
			}
		}
		System.out.println(instance);
		return instance;
	}
	
	
	@SuppressWarnings("unchecked")
	public static <T> T getBean(Class<T> clazz){
		String className = clazz.getName();
		if(instance==null){
			getInstance();
		}
		
		Object obj=map.get(className);
		if(obj==null){
			try {
				obj = Class.forName(daoproperties.getProperty(className)).newInstance();
			} catch (Exception e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
			map.put(className, obj);
		}
		
		return (T) obj;
	}
	
}

 

UserBiz类:

package org.forever.biz;

import org.forever.dao.UserDao;
import org.forever.factory.AbstractDaoFactory;

public class UserBiz {

	private UserDao userDao;

	public UserBiz() {
		userDao = AbstractDaoFactory.getBean(UserDao.class);
	}
	
	public static void main(String[] args) {
		System.out.println(AbstractDaoFactory.getBean(UserDao.class));
		System.out.println(AbstractDaoFactory.getBean(UserDao.class));
		System.out.println(AbstractDaoFactory.getBean(UserDao.class));
	}
}

 AbstractDaoFactory.properties:

#org.forever.factory.AbstractDaoFactory=org.forever.factory.MySqlFactory
org.forever.factory.AbstractDaoFactory=org.forever.factory.OracleFactory

MySqlFactory.properties:

org.forever.dao.UserDao=org.forever.dao.mysql.UserDaoImpl

OracleFactory.properties:

org.forever.dao.UserDao=org.forever.dao.oracle.UserDaoImpl


 

  • 大小: 22.9 KB
0
0
分享到:
评论

相关推荐

    抽象工厂-设计模式

    抽象工厂-设计模式-主要介绍怎么样创建抽象工厂并实现数据库创建

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...

    设计模式-抽象工厂-Java 源码

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而具体的对象族由子类决定。这种模式允许系统在不指定具体产品的前提下,能够创建一系列相关或相互依赖的对象,同时避免了硬编码所造成的...

    简单工厂-工厂方法-抽象工厂 对比总结

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    抽象工厂模式--演示代码

    抽象工厂模式是设计模式中的一种,属于创建型模式。它提供了一个创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“家族”这个概念,即一系列相关的对象,它们可以相互协作以完成特定任务。在Java中,...

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    抽象工厂模式 - PHP版

    抽象工厂模式是一种高级的设计模式,属于创建型模式,它提供了一种创建对象族的方法,而无需指定其具体的类。在PHP中,抽象工厂模式尤其适用于那些需要创建一系列相关或相互依赖的对象,而又不希望硬编码具体类名的...

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    java设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...

    java抽象工厂模式实例----手机工厂

    抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在Java编程中,这个模式经常被用来实现跨平台或者不同品牌产品的一致性...

    设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...

    抽象工厂模式uml类图

    java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式

    抽象工厂设计模式抽象工厂设计模式

    抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式

    抽象工厂模式+反射技术(抽象工厂模式+简单工厂模式)

    抽象工厂模式是设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在软件工程中,当系统需要在运行时选择不同的产品族时,或者想要隔离具体产品的实现细节时,抽象工厂...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

    抽象工厂模式 - 代码(Java)

    抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的关键在于,它允许在运行时创建一个产品家族,这些产品都属于同一类别,但可能有不同的实现。在Java中,...

    设计模式-抽象工厂模式javademo

    抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...

    C# Winform抽象工厂架构

    "C# Winform抽象工厂架构"是一个基于C#语言和Windows Forms(Winform)平台,利用抽象工厂设计模式构建的多层架构项目。在这个项目中,开发者使用了抽象工厂模式来创建和管理报表查询的相关组件,同时结合了反射机制...

Global site tag (gtag.js) - Google Analytics