抽象工厂模式

来源:互联网 发布:在windows上编写swift 编辑:程序博客网 时间:2024/06/07 15:58

抽象工厂模式:为一组相关或者相互依赖的对象提供一个接口,而且无需指定他们的具体类。

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

用了工厂方法模式的数据访问程序

User.java用户类(只有ID和Name两个字段)

public 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;    }}

IUser.java-用于对User进行操作的通用接口

public interface IUser {    void insert(User user);    User getUser(int id);}

AccessUser.java-对数据库操作的具体实现

public class AccessUser implements IUser{    @Override    public void insert(User user) {        System.out.println("在Access中给User表增加一条记录");    }    @Override    public User getUser(int id) {        System.out.println("在Access中根据ID获取User表中的一条记录");        return null;    }}

SqlServerUser.java-对数据库操作的具体实现

public 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;    }}

IFactory.java-用于创建访问user表的对象

public interface IFactory {    IUser createUser();}

sqlServerFactory.java-实现IFactory接口,创建sqlServerUser对象

public class SqlServerFactory implements IFactory{    @Override    public IUser createUser() {        return new SqlServerUser();    }}

AccessFactory.java-实现IFactory接口,创建AccessUser对象

public class AccessFactory implements IFactory{    @Override    public IUser createUser() {        return new AccessUser();    }}

测试

public class Test {    public static void main(String[] args) {        User user = new User();        SqlServerFactory sqlServerFactory = new SqlServerFactory();        IUser createUser = sqlServerFactory.createUser();        createUser.insert(user);        createUser.getUser(1);    }}

输出

改进(去除IFactory、SqlServerFactory、AccessFactory三个工厂,取而代之DataAccess类,用一个简单工厂模式实现)

DataAccess.java

public class DataAccess {    private static final String db="SqlServer";//  private static final String db="Access";    public static IUser createUser(){        IUser result=null;        switch(db){        case "SqlServer":result=new SqlServerUser(); break;        case "Access":result=new AccessUser();break;        }        return result;    }    public static IDepartment createDepartment(){        IDepartment result=null;        switch(db){        case "SqlServer":result=new SqlServerDepartment(); break;        case "Access":result=new AccessDepartment();break;        }        return result;    }}

测试

public class Test2 {    public static void main(String[] args) {        User user = new User();        Department department = new Department();        IUser iu = DataAccess.createUser();        IDepartment id = DataAccess.createDepartment();        iu.insert(user);        iu.getUser(1);        id.insert(department);        id.getUser(1);    }}

用反射+抽象工厂进行数据访问

通过反射实现程序由编译时创建对象变为运行时创建对象,通过字符串来实例化对象。
DataAccessR类利用反射技术,取代IFactory、SqlServerFactory、AccessFactory三个工厂

DataAccessR.java

public class DataAccessR {    private static final String commonPackageName="zx.abstractfactory.test2";    private static final String db="sqlserver";    public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{        String className=commonPackageName+"."+db+".SqlServerUser";        System.out.println("SqlServerUser的全路径名 "+className);        IUser sqlServerUser=(SqlServerUser)Class.forName(className).newInstance();        return sqlServerUser;    }    public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException{        String className=commonPackageName+"."+db+".SqlServerDepartment";        System.out.println("SqlServerDepartment的全路径名 "+className);        IDepartment sqlServerDepartment=(SqlServerDepartment)Class.forName(className).newInstance();        return sqlServerDepartment;    }}

测试

public class TestR {    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {        User user = new User();        Department department = new Department();        IUser createUser = DataAccessR.createUser();        IDepartment createDepartment = DataAccessR.createDepartment();        createUser.insert(user);        createUser.getUser(1);        createDepartment.insert(department);        createDepartment.getUser(1);        System.out.println("testR");    }}

输出

0 0
原创粉丝点击