zoukankan      html  css  js  c++  java
  • 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()));
        }
    }

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

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

  • 相关阅读:
    iOS BCD编码
    Java泛型解析(02):通配符限定
    HDU 5317 RGCDQ(素数个数 多校2015啊)
    通过getElementById来取得Form里的表单元素
    关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)
    cocos2d-x之道~制作第一款文字游戏(二)
    Html5实现手机九宫格password解锁功能
    [Python] 字典推导 PEP 274 -- Dict Comprehensions
    NYOJ 36 最长公共子序列 (还是dp)
    【设计模式】学习笔记5:工厂模式
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/7994137.html
Copyright © 2011-2022 走看看