• 研读设计模式小结


    1. 设计模式:

      指在软件开发过程中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。

    2. 简单工厂:

      本质: 选择实现。

    注意:简单工厂的重点在选择,实现是已经做好的。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端与实现之间解耦。

    实现简单工厂的难点在于“如何选择”实现,有传递参数的方法,有动态参数的方法。

     /**简单工厂 */
    public class Factory {

        public static Api create_GetApi(int type) {

        Api api = null;
        if (type == 1) {
            api = new Api1();
        } else if (type == 2) {
            api = new Api2();
        }
        
        return api;
        }
    }


    使用时:

    Api api = Factory.create_GetApi( 1 );



    3. 外观模式 Facade

      本质:封装交互,简化调用。

      外观模式封装了子系统外部和子系统内部多个模块的交互过程,从而简化了外部的调用。通过外观,子系统为外部提供一些高层的接口,方便使用。

      客户端不需要去关心子系统内部模块的变动情况,只与这个外观类有依赖关系。

    /*外观模式 Facade*/
    public class FacadeApi {
        
        private FacadeAp i ( ) {    }
        
        public static void test ( ) {
        AModuleApi a = new AModuleImpl();
        a.testA();
        BModuleApi b = new BModuleImpl();
        b.testB();
        CModuleApi c = new CModuleImpl();
        c.testC();
        }
    }
    
    /*外观模式 Facade*/
    public interface FacadeApi{
        
        //对外提供的组合方法
        public void test();
        
        //这些是ABC模块对子系统外的接口
        public void a1();
        public void b1();
        public void c1();
    }


    4.  适配器模式

      本质:转换匹配,利用功能

      适配器通过转换现在的实现,从而能把已有的实现匹配成需要的接口。转换匹配是手段,利用已有的功能才是目的。

      在实现的时候,适配器通常是一个类,一般会让适配器类去实现Target接口,然后在适配器的具体实现里面调用Adaptee。也就是说,适配器通常是一个Target类型,而不是Adaptee类型。

    public class TwoDirectAdapter implements LogDBApi, LogFileApi {
        
        private LogDBApi dbLog;
        private LogFileApi fileLog;
        
        public TwoDirectAdapter( LogDBApi db , LogFileApi file) {
           this.dbLog = db;
           this.fileLog = file;
        }
        
        /*把文件操作的方式适配成DB实现方式;*/
        public void createLog( LoginModule lm) {
            // 1. 读取文件内容;
            // 2. 加入新的日志对象;
            // 3. 重新写入文件;
        }
    }


    5. 单例模式 Singleton

      本质: 控制实例数目

      单例模式是用来保证这个类在运行期间只会被创建一个类实例,另外,单例模式还提供了一个全局唯一访问这个类实例的访问点。

    /*  懒汉式单例 */
    public class Singleton {
        
        private static Singleton uniqueInstance = null;
        private Singleton() {}
        
        public static synchronized Singleton getInstance ( ) {
        
           if ( uniqueInstance == null ) {
               uniqueInstance = new Singleton();
           }
        
           return uniqueInstance;
        }
    }
    
    
    /*  饿汉式单例 */
    public class Singleton {
        
        private static Singleton uniqueInstance =  new Singleton();
        private Singleton() {}
       
        public static  Singleton getInstance ( ) {
            return uniqueInstance;
        }
    }

    /* 最优的单例 */
    public class Singleton {
        
        private static class SingletonHolder{
    
          private static Singleton uniqueInstance =  new Singleton();
         }
    
        private Singleton() { }
       
        public static  Singleton getInstance ( ) {
            return SingletonHolder.uniqueInstance; 
        } 
    }
    
    
  • 相关阅读:
    数据仓库基本概念
    收藏--关于命名规范、维度明细层及集市汇总层设计的思考
    Thinkphp6框架学习:有关数据库的基本操作
    算法第一章作业
    解决 Intellij IDEA Cannot Resolve Symbol ‘BASE Decoder’ 问题
    利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构
    利用BFS解决拯救007问题 -- 数据结构
    列出连通集(DFS及BFS遍历图) -- 数据结构
    42行代码完成深入虎穴
    利用Tarjan算法解决(LCA)二叉搜索树的最近公共祖先问题——数据结构
  • 原文地址:https://www.cnblogs.com/surong/p/2439168.html
Copyright © 2020-2023  润新知