首页 > 数据库 >20230423 15. 抽象工厂模式 - 数据库

20230423 15. 抽象工厂模式 - 数据库

时间:2023-06-19 09:58:52浏览次数:49  
标签:IUser 15 20230423 void db public 抽象 工厂 数据库

介绍

工厂方法模式是定义一个用于创建对象的接口,让子类决定实例化哪一个类。

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

抽象工厂模式

  • AbstractProductA和AbstractProductB是两个抽象产品,之所以为抽象,是因为它们都有可能有两种不同的实现
  • ProductA1、ProductA2和ProductB1、ProductB2就是对两个抽象产品的具体分类的实现
  • IFactory是一个抽象工厂接口,它里面应该包含所有的产品创建的抽象方法
  • ConcreteFactory1和ConcreteFactory2就是具体的工厂了

通常是在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂

抽象工厂模式的好处

  • 便是易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置
  • 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中

缺点:增加一个新产品Project,至少要增加三个类,IProject、SqlserverProject、AccessProject,还需要更改IFactory、SqlserverFactory和AccessFactory才可以完全实现

所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合。

抽象工厂模式和工厂方法模式的不同点:

  • 继承方式不同:工厂方法模式中的工厂类必须继承同一个抽象类或接口,而抽象工厂类可以继承多个抽象类或接口。
  • 创建对象的方式不同:工厂方法模式中的工厂类只能创建一种产品,而抽象工厂类可以创建多种不同的产品。
  • 设计思路不同:工厂方法模式强调工厂的通用性,以及与产品之间的关系,而抽象工厂类则强调抽象产品的概念。
  • 适用场景不同:工厂方法模式适用于创建同类型的产品族,而抽象工厂类适用于创建任意类型的产品族。

代码示例

AbstractProduct 抽象产品

public interface IUser {
    void insert();

    void get();
}

public interface IDepartment {
    void insert();

    void get();
}

产品实现

public class AccessDepartment implements IDepartment {
    @Override
    public void insert() {
        System.out.println("access 插入一条 department 信息");
    }

    @Override
    public void get() {
        System.out.println("access 获得一条 department 信息");
    }
}

public class AccessUser implements IUser {
    @Override
    public void insert() {
        System.out.println("access 插入一条 user 信息");
    }

    @Override
    public void get() {
        System.out.println("access 获得一条 user 信息");
    }
}

public class SqlServerDepartment implements IDepartment {
    @Override
    public void insert() {
        System.out.println("sql server 插入一条 department 信息");
    }

    @Override
    public void get() {
        System.out.println("sql server 获得一条 department 信息");
    }
}

public class SqlServerUser implements IUser {
    @Override
    public void insert() {
        System.out.println("sql server 插入一条 user 信息");
    }

    @Override
    public void get() {
        System.out.println("sql server 获得一条 user 信息");
    }
}

用反射+配置文件实现的工厂

public class DataAccess {
    private static String db = null;


    public static IUser createUser() {
        String db = getDb();
        String className = "study.hwj.p15." + db + "User";
        return (IUser) getInstance(className);
    }

    public static IUser createDepartment() {
        String db = getDb();
        String className = "study.hwj.p15." + db + "Department";
        return (IUser) getInstance(className);
    }

    private static Object getInstance(String className) {
        try {
            return Class.forName(className).getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static String getDb() {
        if (db == null) {
            Properties properties = new Properties();
            try {
                properties.load(new FileReader("D:\\Develop\\workspace\\study\\study-design-pattern\\src\\main\\java"
                        + "\\study\\hwj\\p15\\db.properties"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            db = properties.getProperty("db");
        }
        return db;
    }
}

db.properties

# 这里的值要和类名的前缀相同
db=SqlServer

客户端类

public class Test {
    public static void main(String[] args) {
        IUser user = DataAccess.createUser();
        user.insert();
        user.get();
    }
}

标签:IUser,15,20230423,void,db,public,抽象,工厂,数据库
From: https://www.cnblogs.com/huangwenjie/p/17490362.html

相关文章

  • 2023.6.18 12.数据库配置优化
    12.数据库配置优化mysql数据库优化框架体系优化要有框架和体系:根据⽤户访问⽹站流程优化集群,根据OSI7层模型,从下往上优化数据库!1、硬件层⾯优化1.1数据库物理机采购:1.2服务器硬件配置调整1.2.1服务器BIOS调整1.2.2阵列卡调整2、软件层优化2.1操作系统层⾯优化2.1.1操......
  • MySQL数据库主从搭建(详细图文)
    文章目录前言一、主从搭建准备二、Master1.修改mysql配置文件2.创建授权用户3.查看日志和宿主机master的状态三、slave操作1.修改宿主机的server-id2.进入mysql执行相关命令3.UUID的相关配置四、测试前言主从原理:MySQL之间数据复制的基础是二进制日志文......
  • 查询Oracel 数据文件、数据库用户、删除表空间、删除用户等脚本
    select*fromdba_data_files;select*fromdba_users;--删除用户DROPUSERSYNC_PLUS_1cascade;--删除表空间droptablespaceSYNC_PLUS_ORCLPDB1includingcontentsanddatafiles;为人:谦逊、激情、博学、审问、慎思、明辨、笃行学问:纸上得来终觉浅......
  • 2023.6.18 11.数据库主从复制
    11.数据库主从复制1.MySQL数据库传统复制2.MySQL数据库Gtid复制3.MySQL数据库多源复制4.MysQL数据库读写分离5.MySQL数据库架构演变Mysql的主从架构模式,是很多企业⼴泛使⽤,并且是⼴为熟知的⼀种架构模式,这是DBA所应该熟练掌握的技能。1.mysql主从复制主要⽤途a.⽤于......
  • Luogu3168 [CQOI2015] 任务查询系统 - 主席树 - 二分 -
    题目链接:https://www.luogu.com.cn/problem/P3168题解:主席树可以解决一类j静态区间第\(k\)小的问题,我们先来看看这是怎么工作的主席树的本质就是有很多棵线段树,然后发现这些线段树绝大多数都是重叠的,因此可以优化到空间复杂度\(O(n\logn)\)在这里,我们将序列的每一个位置......
  • 代码随想录算法训练营第十天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号  特点:左括号之后,可能还会有左括号,但是只要有右括号,那么它必须立刻和最近的左括号代码:1charreturnRightChar(char&c)2{3switch(c)4{5case'[':return']';6case'(':return')';7case'{':r......
  • MySQL数据库页存储结构学习与了解
    MySQL数据库页存储结构学习与了解背景MySQL总是出现奇奇怪怪的问题.想着自己能够学习与提高一下.最近看了很多文档.关于MySQL数据库相关的.想着总结和提炼一下,希望能够给未来的工作提供一下指导.MySQL的存储引擎MySQL有多种存储引擎,主要有:InnoDB:是MySQL的默认存储引擎。......
  • 分布式、负载均衡、缓存、数据库中间件【杭州多测师_王sir】
      ......
  • 【雕爷学编程】Arduino动手做(115)---HB100多普勒雷达模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 系统架构设计师笔记第18期:NoSQL数据库
    NoSQL数据库通常指非关系型数据库,是一种基于数据键值对存储、高度分布式、支持动态查询的数据管理系统。NoSQL数据库的设计目的是为了解决传统关系型数据库无法处理的大型应用程序的数据存储和管理问题。它们通常具有以下特点:灵活性:NoSQL数据库没有固定的表结构和查询语言,允许在......