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表一条记录
    


  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6884391.html
Copyright © 2011-2022 走看看