大话设计模式-第15章 就不能不换DB吗?--抽象工厂模式- 高飞网

第15章 就不能不换DB吗?--抽象工厂模式

2016-02-02 16:00:27.0

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。  

    如保存用户数据,可以用Access数据库或MySql数据库:


public class User{
        private int id;
        private String name;

        public void setId(int id){
                this.id = id;
        }
        public int getId(){
                return id;
        }
        public void setName(String name){
                this.name = name;
        }
        public String getName(){
                return name;
        }
}
/**
*  用户数据操作接口
*/
public interface IUser{
        //插入数据
        public void insert(User user);
        //获取用户数据
        public User getUser(int id);
}
public class AccessUser implements IUser{
        public void insert(User user){
                System.out.println("Access insert user");
        }
        public User getUser(int id){
                System.out.println("Access get user");
                return null;
        }
}
public class SqlserverUser implements IUser{
        public void insert(User user){
                System.out.println("Sqlserver insert user");
        }
        public User getUser(int id){
                System.out.println("Sqlserver get user");
                return null;
        }
}
//抽象工厂
public interface IFactory{
        //创建用户操作对象
        public IUser createUser();
}
public class AccessFactory implements IFactory{
        public IUser createUser(){
                return new AccessUser();
        }
}
public class SqlserverFactory implements IFactory{
        public IUser createUser(){
                return new SqlserverUser();
        }
}
public class App{
        public static void main(String[] args){
                User user = new User();
                //IFactory factory = new SqlserverFactory();
                IFactory factory = new AccessFactory();
               
                IUser iu = factory.createUser();

                iu.insert(user);
                iu.getUser(0);
        }
}


优点: 易于交换产品系列,由于具体工厂类在一个应用中只出现一次,即IFactroy factory = new AccessFactory();,这就使得一个应用中改变具体工厂非常简单;让具体的创建实例过程与客户端分离,客户端通过它们的抽象接口操纵实例。

缺点:可能由于产品过多仍然不易维护。


使用简单工厂改进:  
public class DataAccess{

        private static String db = "sqlserver";
        //private static String db = "access";

        public static IUser createUser(){
                IUser user = null;
                switch(db){
                        case "sqlserver":
                                user = new SqlserverUser();
                        break;
                        case "access" :
                                user = new AccessUser();
                        break;
                        default:;
                }
                return user;
        }
}
public class App{
        public static void main(String[] args){
                User user = new User();
               
                IUser iu = DataAccess.createUser();

                iu.insert(user);
                iu.getUser(0);
        }
}


用反射+抽象工厂  
public class DataAccess{

    private static String db = "SqlserverUser";
    //private static String db = "AccessUser";

    public static IUser createUser(){
        try{
            IUser user = (IUser)Class.forName(db).newInstance();
            return user;
        }catch(Exception e){
            e.printStackTrace();
        }  
        return null;
    }  
}

最后可以把数据库类型放到配置文件中启动初始化需要的数据库访问对象。