• 设计模式学习--Abstarct Factory


    What

    Abstarct Factory:提供一个创建一系列相关或相互依赖的接口。而无需指定他们详细类。

    Why

    Abstarct Factory是创建型设计模式的一种,主要在创建对象时解耦,避免对象的直接依赖,方便替换与定制。常见的比方:一个功能有两种不同的风格,须要依据配置来切换不同的风格时。或者在一个须要适用于多个数据库切换的程序中,都会使用Abstact Factory。
    适用于Abstarct Factory的场景:
    1、系统的展现或者功能须要可配置时。


    2、系统模块的创建,须要独立于系统模块时。


    3、系统须要动态定制时。

    How

    如果例如以下场景,在编写数据库訪问层时,须要支持两种数据库的切换。比方能够支持sqlserver和mysql的切换。

    以这个简单的样例,说明Abstarct Factory的实现
    首先我们定义我们的dao接口:

    public interface UserDao {
    
        void insert(User user);
    
        void delete(String id);
    
        User find(String id);
    }
    

    这个接口须要三个简单的方法。插入。删除,查询
    定义用于创建Dao实例的工厂接口

    public interface DaoFactory {
    
        UserDao create();
    
    }
    

    用于訪问sqlserver的UserDao的实现

    public class SqlServerUserDaoImpl implements UserDao {
    
        @Override
        public void insert(User user) {
            System.out.println("sqlserver insert user");
        }
    
        @Override
        public void delete(String id) {
            System.out.println("sqlserver delete user");
        }
    
        @Override
        public User find(String id) {
            System.out.println("sqlserver find user");
            return null;
        }
    }
    

    用于訪问mysql的UserDao的实现

    public class MysqlUserDaoImpl implements UserDao {
    
        @Override
        public void insert(User user) {
            System.out.println("mysql insert user");
        }
    
        @Override
        public void delete(String id) {
            System.out.println("mysql delete user");
        }
    
        @Override
        public User find(String id) {
            System.out.println("mysql find user");
            return null;
        }
    }
    

    用于创建sqlserver userDao的工厂

    public class SqlserverDaoFactoryImpl implements DaoFactory {
    
        @Override
        public UserDao create() {
            return new SqlServerUserDaoImpl();
        }
    }
    

    用于创建mysql userDao的工厂

    public class MysqlDaoFactoryImpl implements DaoFactory {
    
        @Override
        public UserDao create() {
            return new MysqlUserDaoImpl();
        }
    }
    

    client调用方法

    public class App {
    
        public static void main( String[] args ){
    
            DaoFactory daoFactory=new MysqlDaoFactoryImpl();
            UserDao userDao=daoFactory.create();
            userDao.insert(null);
    
            DaoFactory daoFactory1=new SqlserverDaoFactoryImpl();
            UserDao userDao1=daoFactory1.create();
            userDao1.delete("");
        }
    }
    

    以上实例的类图例如以下:

    Discuss

    在以上的样例中。还能够延伸到把数据库的选择写在配置文件里。然后在系统启动时依据配置通过反射载入不同的程序,这个在曾经使用c#做一个系统时用到过。在java的web开发中,一般使用spring框架,它提供了IOC技术,通过配置bean来做数据源的初始化。


    在spring的源码中,也有Abstract Factory的使用,比方BeanFactory就是一个样例,当然它的设计要比本文中的样例,复杂的多。

    ChangeLog

    在学习时发现本节演示样例不够完好,所以进行了完好,添加在ChangeLog中,两者的差别和联系在设计模式学习--Factory Method的Discuss章节中。
    演示样例代码基于以上演示样例改动。假设理解了演示样例中的代码,改动为例如以下结构的代码比較简单就不在帖出,也能够到去我的GitHub下载。

  • 相关阅读:
    [usaco3.2.5]msquare
    [usaco3.2.4]ratios
    [usaco3.2.3]spin
    [文献记录] Few-shot Learning for Named Entity Recognition in Medical Text 医学文本中命名实体识别的小样本学习
    计算机保研经验分享
    文本处理、词频统计与Simhash生成文档指纹
    [知乎live笔记]如何得到好的科研Idea
    POJ 2787:算24
    POJ 2964:日历问题 日期转换+闰年月份可放在一个month[2][12]数组里
    POJ-1835 宇航员 空间方向模拟+打表
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6794541.html
Copyright © 2020-2023  润新知