zoukankan      html  css  js  c++  java
  • java设计模式总结

    java设计模式

    创建型模型

    包括:单例模式、建造者模式、原型模式、工厂模式

    单例模式

    保证对象在一个jvm中,只有一个实例存在

    适用场景:

    • 创建对象比较繁琐,且消耗较大的
    • 控制全局的类

    分类:

    • 饿汉式

      • 类初始化时创建单例,线程安全,适用于单例占内存小的场景,否则推荐使用懒汉式延迟加载
    • 懒汉式

      • 需要创建单例的时候再创建,需要考虑线程安全(性能不太好)
    • 双重检验锁

      • 解决的问题:当两个线程同时执行到了

        if(null == instance){   // AB线程均执行到此处,判断instance为空。
        ...
        }
        

        两个线程会继续往下执行,那么内存中就存在了两个实例

    • 静态内部类方式:可以同时保证延迟加载和线程安全

    建造者模式

    原型模式

    对一个原型类进行复制克隆产生新的对象

    要求:被复制的对象需要实现Cloneable接口,和重写Object类中的clone方法;

    好处:通过原型模式创建对象比直接new会有更好的性能,Object类的clone方法时一个本地方法,直接操作内存中的二进制流。

    工厂模式

    工厂方法模式

    1、普通工厂模式

    建立一个工厂类,对实现了同一个接口的一些类进行实例的创建

    通过入参判断所需的是哪一个实体类,然后直接返回

    2、多个工厂方法模式

    提供多个工厂方法,分别创建对象

    对不同的返回实例,编写不同的方法,根据方法调用返回实现了同一个接口的不同实例。

    3、静态工厂方法模式(常用的模式)

    将上面的多个工厂方法设置为静态的,无需创建实例就可得到所需类。

    抽象工厂模式

    创建多个工厂类,进一步提高了工厂的扩展性

    对不同工厂的抽象和分类,使用的时候,根据自己所需选择对应的工厂类,进而获取到所需的实例

    结构型模型

    包括:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、亨元模式

    适配器模式

    1、类的适配器模式

    需求:在一个接口类A中,存在方法methodA(),目前需要在methodA()中调用另一个类B的methodB().

    实现:创建适配器类C继承B,实现A接口,重写methodA(),方法中调用super.methodB;

    public class C extends B implements C{
        @Override
        public void methodA() {
            //...一些操作...
            super.methodB();
            //...一些操作...
        }
    }
    

    2、对象的适配器模式

    与类适配器不同是,类适配器通过继承来完成适配,对象适配则是通过关联来完成。

    public class C implements A{
        // 适配者是对象适配器的一个属性
        private B b = new B();
    
        @Override
        public void methodA() {
            //...
            b.B();
            //...
        }
    }
    

    3、接口的适配器模式

    问题:有时候我们实现一个接口,但是不想实现里边无关的其他方法,就需要一个中间适配器,由中间适配器实现接口的所有方法,然后我们定义一个类继承这个适配器,只重写我们关心的方法即可。

    package com.demo.adapter.interfaceadapter;
    
    /**
     * 接口类.
     */
    
    public interface DCOutput {
        int output5V();
        int output9V();
        int output12V();
        int output24V();
    }
    
    package com.demo.adapter.interfaceadapter;
    
    import com.demo.adapter.classadapter.AC220;
    
    /**
     * 适配器类.
     */
    public abstract class PowerAdapter implements DCOutput{
        protected AC220 mAC220;
    
        public PowerAdapter(AC220 ac220){
            this.mAC220 = ac220;
        }
    
        @Override
        public int output5V() {
            return mAC220.output220V();
        }
    
        @Override
        public int output9V() {
            return mAC220.output220V();
        }
    
        @Override
        public int output12V() {
            return mAC220.output220V();
        }
    
        @Override
        public int output24V() {
            return mAC220.output220V();
        }
    }
    
    package com.demo.adapter.interfaceadapter;
    
    import com.demo.adapter.classadapter.AC220;
    
    /**
     * 适配器的使用.
     */
    
    public class Power5VAdapter extends PowerAdapter {
    
        public Power5VAdapter(AC220 ac220) {
            super(ac220);
        }
    
        @Override
        public int output5V() {
            int output = 0;
            if (mAC220 != null) {
                output = mAC220.output220V() / 44;
            }
            return output;
        }
    }
    

    装饰者模式

    增强被装饰者的功能,要求装饰者和被装饰者实现同一个接口,装饰者持有被装饰者对象的实例

    代理模式

    外观模式

    将一类相关的组件放到一个类里,并实现相关的方法;

    public class Facade {
    
        //被委托的对象
        SubSystemA a;
        SubSystemB b;
        SubSystemC c;
        SubSystemD d;
        
        public Facade() {
            a = new SubSystemA();
            b = new SubSystemB();
            c = new SubSystemC();
            d = new SubSystemD();
        }
        
        //提供给外部访问的方法
        public void methodA() {
            this.a.dosomethingA();
        }
        
        public void methodB() {
            this.b.dosomethingB();
        }
        
        public void methodC() {
            this.c.dosomethingC();
        }
        
        public void methodD() {
            this.d.dosomethingD();
        }
        
    }
    
    public class Client {
    
        public static void main(String[] args) {
            Facade facade = new Facade();
            
            facade.methodA();
            facade.methodB();
        }
        
    }
    

    桥接模式

    比如JDBC桥接DriverManager一样;JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要改动太多的代码,原因就是JDBC提供统一的接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。

    组合模式(部分整体模式)

    亨元模式(共享池、数据库连接池)

    主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,如数据库连接池。

    行为型模型

    包括:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

    策略模式(多种算法封装)

    模板方法模式

    观察者模式(发布-订阅模式)

    当一个对象变化时,其他依赖该对象的都对象都会收到通知,并且随着变化,对象之间是一种一对多的关系。类似邮件订阅和RSS订阅,当你订阅了该文章,如果后续有更新,会及时通知你。

    迭代器模式

    责任链模式(多任务在形成一条链,请求在链上传递)

    有多个对象,每个对象都持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,知道某一个对象决定处理该请求。但是发出者并不清楚到底最终哪个对象会处理该请求,所以责任链可以实现在隐瞒客户端的情况下,对系统进行动态的调整。

    命令模式

    备忘录模式

    状态模式

    当对象的状态改变时,同时改变其行为

    访问者模式

    中介者模式

    中介者模式也是用来降低类之间耦合的,如果使用中介者模式,只需关心和中介类的关系,具体类和类之间的关系及调度交给中介类就行。

    解释器模式

    建造者模式(创建复合对象)

    工厂类模式是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建符合对现象,所谓复合对象就是指某个类有不同的属性。

    六大设计原则

    • 开闭原则
      • 对扩展开放,对修改关闭,在程序需要扩展的时候,不能去修改原有的代码,要实现一个热插拔的效果。尽可能的使用接口和抽象类,从而使程序更好的扩展,更容易的维护和升级。
    • 里氏代换原则(LSP)
      • 在继承类的时候金,除了扩展一些新的功能外,尽量不要修改或者删除对父类方法的引用,也尽量不要在父类中重载方法。
    • 依赖倒转原则
      • 高层次模块不依赖低层次模块的细节,高层次就是不依赖细节而是依赖抽象(不依赖具体的类,而是依赖于接口)
    • 接口隔离原则
      • 在定义接口方法时,应该尽量合理化,尽量追求简单最小,避免接口臃肿。
    • 迪米特法则(最少知道原则)
      • 一个对象对其它对象有最少的了解,对自己需要耦合或者调用的类知道的最少,类的内部如何实现,如何复杂都与调用者或依赖者没关系,调用者或者依赖者只需要知道他需要的方法即可,其他的一概不关心。
    • 单一职责原则
      • 对功能进行分类,代码进行解耦,不能够将不同的功能放在一起实现,一次只做一件事。
  • 相关阅读:
    宣布降低Windows Azure 存储和计算的价格
    物联网操作系统的概念和特点
    基于Windows8与Visual Studio11开发第一个内核驱动程序
    在 C++ 中使用 PPL 进行异步编程
    现实世界的Windows Azure:采访Figlo的全球合作伙伴支持经理Nathan Brouwer
    物联网操作系统随笔
    Windows Azure Toolkit for Windows 8 Consumer Preview的升级版发布了
    上海招聘会场所
    理解 Delphi 的类(十) 深入方法[3] 调用时参数分割
    关于类的入门例子(7): 遍历窗体的所有父类
  • 原文地址:https://www.cnblogs.com/xujie09/p/11626562.html
Copyright © 2011-2022 走看看