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

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

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

  • 相关阅读:
    nacos 命名空间
    Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences
    gitee
    maven引入junit 4.12,项目import org.junit.Test 还是报错.
    gitflow
    202011
    idea 忽略显示不需要的文件
    服务熔断 & 降级区别
    各种微服务框架对比
    zookeeper not connected
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/7994137.html
Copyright © 2011-2022 走看看