java 之 抽象工厂模式(大话设计模式)

看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套。

来看下类图:

大话设计模式-类图

看类图已经很乱了,来简单的梳理下。我们只看接口,这样就不难看出实际上是抽象工厂生产抽象产品的过程,而具体实现都是各自的实现类来做。

看下具体的demo:

工厂层

/**
 * 工厂接口
 */
public interface IFactory {

    public IUser createUser();

    public IDepartment createDepartment();
}
/**
 * Mysql工厂
 */
public class MysqlFactory implements IFactory{

    @Override
    public IUser createUser() {
        return new UserMapper();
    }

    @Override
    public IDepartment createDepartment() {
        return new DepartmentMapper();
    }

}
/**
 * sqlserver工厂
 */
public class SqlServerFactory implements IFactory{

    @Override
    public IUser createUser() {
        return new UserMapper();
    }

    @Override
    public IDepartment createDepartment() {
        return new DepartmentMapper();
    }

}

 

产品层

/**
 * 部门层接口
 */
public interface IDepartment {

    public int saveDepartment(Department department);

    public IDepartment getDepartment(int id);
}
/**
 * 角色数据层接口
 */
public interface IUser {

    public int saveUser(User user);

    public IUser getUser(int id);
}
/**
 * 部门数据层
 */
public class DepartmentMapper implements IDepartment{

    @Override
    public int saveDepartment(Department department) {
        System.out.println("保存了部门");
        return 1;
    }

    @Override
    public IDepartment getDepartment(int id) {
        System.out.println("得到了一个部门");
        return null;
    }


}
/**
 * 角色数据层
 */
public class UserMapper implements IUser {

    @Override
    public int saveUser(User user) {
        System.out.println("保存Uer");
        return 1;
    }

    @Override
    public IUser getUser(int id) {
        System.out.println("得到一个User");
        return null;
    }


}

 

客户端及实体类

/**
 *用户实体类
 */
public class User{


}
/**
 * 部门实体类
 */
public class Department {

}
/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) {
//        IFactory factory = new MysqlFactory();
        IFactory factory = new SqlServerFactory();
        IUser userMapper = factory.createUser();
        userMapper.getUser(userMapper.saveUser(new User()));
    }
}

 

如果我们切换数据库,我们只需要切换工厂就可以了,其他的代码不需要改。

以上是笔者对抽象工厂的理解,希望能帮助学习抽象工厂的小伙伴!

posted @ 2017-12-06 18:10  红尾巴的猪  阅读(647)  评论(0编辑  收藏  举报