zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    抽象工厂(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。一般用反射,配置文件等方式实现。

    1、易于交换产品系列。

    因为详细工厂类。在一个应用中仅仅须要在初始化的时候出现一次。这就使得改变一个应用的详细工厂变得很easy,它仅仅须要改变详细工厂就可以使用不同的产品配置。

    2、它让详细的创建实例过程与client分离,client是通过它们的抽象接口操纵实例,产品的详细类名也被详细工厂的实现分离。不会出如今客户代码中。
    假设需求来自添加功能,此时,须要添加若干类,并改动相关的工厂类。
    package gof23;
    
    public class AbstractFactoryTest {
    	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    		//操作SqlServer数据库
    		DataAccess.setFullyQualifiedName("gof23.Sqlserver");
    		IUser user = DataAccess.createUser();
    		user.insert(null);
    		user.getUser(0);
    		IDepartment dept = DataAccess.createDepartment();
    		dept.insert(null);
    		dept.getDept(0);
    		System.out.println("
    "+"---------------我是华丽的切割线------------------"+"
    ");
    		//操作Mysql数据库
    		DataAccess.setFullyQualifiedName("gof23.Mysql");
    		user = DataAccess.createUser();
    		user.insert(null);
    		user.getUser(0);
    		dept = DataAccess.createDepartment();
    		dept.insert(null);
    		dept.getDept(0);
    	}
    }
    
    /*
     * 用户表的字段
     */
    class User {
    	private int id;
    	private String name;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    
    /*
     * 部门表的字段
     */
    class Department {
    	private int id;
    	private String deptName;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getDeptName() {
    		return deptName;
    	}
    	public void setDeptName(String deptName) {
    		this.deptName = deptName;
    	}
    }
    
    /*
     * 利用反射技术,去除switch或if,解除分支推断带来的耦合
     */
    class DataAccess {
    	private static String FullyQualifiedName;
    	
    	public static String getFullyQualifiedName() {
    		return FullyQualifiedName;
    	}
    
    	public static void setFullyQualifiedName(String fullyQualifiedName) {
    		FullyQualifiedName = fullyQualifiedName;
    	}
    
    	public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    		String name = FullyQualifiedName + "User";
    		return (IUser) Class.forName(name).newInstance();
    	}
    	
    	public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    		String name = FullyQualifiedName + "Department";
    		return (IDepartment) Class.forName(name).newInstance();
    	}
    }
    
    /*
     * 用户表的接口
     */
    interface IUser{
    	public void insert(User user);
    	public User getUser(int id);
    }
    
    /*
     * Sqlserver用户表的实现
     */
    class SqlserverUser implements IUser {
    
    	@Override
    	public void insert(User user) {
    		System.out.println("在SQL server中给User表添加一条记录");
    	}
    
    	@Override
    	public User getUser(int id) {
    		System.out.println("在SQL server中依据ID得到User表一条记录");
    		return null;
    	}
    	
    }
    
    /*
     * Mysql用户表的实现
     */
    class MysqlUser implements IUser {
    
    	@Override
    	public void insert(User user) {
    		System.out.println("在Mysql中给User表添加一条记录");
    	}
    
    	@Override
    	public User getUser(int id) {
    		System.out.println("在Mysql中依据ID得到User表一条记录");
    		return null;
    	}
    	
    }
    
    /*
     * 部门表的接口
     */
    interface IDepartment {
    	public void insert(Department dep);
    	public Department getDept(int id);
    }
    
    /*
     * Sqlserver部门表的实现
     */
    class SqlserverDepartment implements IDepartment {
    
    	@Override
    	public void insert(Department dep) {
    		System.out.println("在SQL server中给Department表添加一条记录");
    	}
    
    	@Override
    	public Department getDept(int id) {
    		System.out.println("在SQL server中依据ID得到Department表一条记录");
    		return null;
    	}
    	
    }
    
    /*
     * Mysql部门表的实现
     */
    class MysqlDepartment implements IDepartment {
    
    	@Override
    	public void insert(Department dep) {
    		System.out.println("在Mysql中给Department表添加一条记录");
    	}
    
    	@Override
    	public Department getDept(int id) {
    		System.out.println("在Mysql中依据ID得到Department表一条记录");
    		return null;
    	}
    	
    }

    执行结果为:
    在SQL server中给User表添加一条记录
    在SQL server中依据ID得到User表一条记录
    在SQL server中给Department表添加一条记录
    在SQL server中依据ID得到Department表一条记录
    
    ---------------我是华丽的切割线------------------
    
    在Mysql中给User表添加一条记录
    在Mysql中依据ID得到User表一条记录
    在Mysql中给Department表添加一条记录
    在Mysql中依据ID得到Department表一条记录
    


  • 相关阅读:
    CF754A
    快速幂模板
    循环-21. 求交错序列前N项和(15)
    循环-20. 猜数字游戏(15)
    循环-19. 币值转换
    循环-18. 龟兔赛跑(20)
    循环-17. 简单计算器(20)
    循环-11. 水仙花数(20)
    IO 分支 循环
    check list
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6884391.html
Copyright © 2011-2022 走看看