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();
    		}
    		
    	}
    	
    }
    

      

  • 相关阅读:
    02-05 flutter provider的使用
    02-04 flutter 构造函数总结
    02-03 flutter异步
    02-02dart语法
    02-01dart语法
    01-01 iOS内存对齐、内存对齐算法
    01-02 iOS kvo、kvc
    01-03 category 原理概述
    多线程编程 (2) -NSOperation
    IOS基本控件属性
  • 原文地址:https://www.cnblogs.com/zcy-backend/p/6701090.html
Copyright © 2011-2022 走看看