码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-04-12 20:38:31      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:err   except   mysqld   ntb   setting   抽象工厂模式   tab   切换   use   

阅读材料:http://baike.xsoftlab.net/view/209.html#3_2

抽象工程模式解决的问题:

当前有一套产品,称为A;另一套产品称为B。客户端代码需要在两套产品中切换。

抽象工厂模式相当于在简单工厂模式之上又抽象了一层,使得客户端代码在两套产品切换中比较方便。

但是抽象工厂模式还是会引发大量的改动。如果要减少改动,可以使用反射+简单工厂解决这个问题。

UML:

技术分享

User相关代码:

package abstractfactory;

public abstract class IUser {
	
	public abstract void select();
	
	public abstract void insert();
}

package abstractfactory;

public class MySQLUser extends IUser {

	@Override
	public void select() {
		System.out.println("MySQL select User");
	}

	@Override
	public void insert() {
		System.out.println("MySQL insert User");
	}

}

package abstractfactory;

public class OracleUser extends IUser {

	@Override
	public void select() {
		System.out.println("Oracle select User");
	}

	@Override
	public void insert() {
		System.out.println("Oracle insert User");
	}

}

 

Department相关代码:

package abstractfactory;

public abstract class IDepartment {
	
	public abstract void select();
	
	public abstract void insert();

}

package abstractfactory;

public class MySQLDepartment extends IDepartment {

	@Override
	public void select() {
		System.out.println("MySQL select Department");
	}

	@Override
	public void insert() {
		System.out.println("MySQL insert Department");
	}

}

package abstractfactory;

public class OracleDepartment extends IDepartment {

	@Override
	public void select() {
		System.out.println("Oracle select Department");
	}

	@Override
	public void insert() {
		System.out.println("Oracle insert Department");
	}

}

 

DataBase类:

使用反射确定要实例化哪个子类,数据库类型存储在xml中。

package abstractfactory;

import java.io.IOException;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class DataBase {
	private static String databaseName = null;
	
	static{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
		DocumentBuilder builder = null;
		try {
			builder = factory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}     
        Document document = null;
		try {
			document = builder.parse("src\\abstractfactory\\Settings.xml");
		} catch (SAXException | IOException e) {
			e.printStackTrace();
		}  
        Element database = (Element) document.getDocumentElement();
        databaseName = database.getAttribute("Name");
	}
	
	public static IUser getUserHandler() 
			throws InstantiationException, 
			IllegalAccessException, 
			ClassNotFoundException {
		String classname = "abstractfactory." + databaseName + "User";
		return (IUser) Class.forName(classname).newInstance();
	}
	
	public static IDepartment getDepartmentHandler() 
			throws InstantiationException, 
			IllegalAccessException, 
			ClassNotFoundException {
		String classname = "abstractfactory." + databaseName + "Department";
		return (IDepartment) Class.forName(classname).newInstance();
	}
}

 

settings.xml

<?xml version="1.0" encoding="UTF-8"?><DataBase Name="Oracle"/>

Demo:

package abstractfactory;

public class AbstractFactoryDemo {
	
	public static void main(String[] args) {
		IUser user;
		IDepartment department;
		try {
			user = DataBase.getUserHandler();
			user.select();
			user.insert();
			department = DataBase.getDepartmentHandler();
			department.select();
			department.insert();
		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	
}

  

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

标签:err   except   mysqld   ntb   setting   抽象工厂模式   tab   切换   use   

原文地址:http://www.cnblogs.com/zcy-backend/p/6701090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!