zoukankan      html  css  js  c++  java
  • 设计模式11:抽象工厂模式

    阅读材料: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();
    		}
    		
    	}
    	
    }
    

      

  • 相关阅读:
    [Z] Windows 8/10 audio编程
    [Z]The Boost C++ Libraries
    [Z] windows进程在32、64位系统里用户和系统空间的地址范围
    [Z] 关于c++ typename的另一种用法
    [z] 人工智能和图形学、图像处理方面的各种会议的评级
    [Z] 计算机类会议期刊根据引用数排名
    关于windows的service编程
    关于Linux session管理与GUI架构
    搭建框架-ECS.ECommerce
    不调用构造函数而创建一个类型实例
  • 原文地址:https://www.cnblogs.com/zcy-backend/p/6701090.html
Copyright © 2011-2022 走看看