• 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()));
        }
    }

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

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

  • 相关阅读:
    布隆过滤器
    string.ToString("X")的含义,转换为16进制
    Stream.Write()和Stream.Read(), Stream.Flush的作用,待学习
    linux查看CPU,内存使用情况
    HttpContext.Current.Request.InputStream
    程序员常去的10个顶级开发社区
    JavaScript 对象初探
    PHP – 架構設計 Data Access Layer 篇
    如何用 JavaScript 动态呼叫函数
    PHP – EasyUI DataGrid 资料存的方式
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/7994137.html
Copyright © 2020-2023  润新知