zoukankan      html  css  js  c++  java
  • 学习过的设计模式总结(分别从概念、分类、优缺点、应用、区别来说)

    单例模式
      概念
         确保某个类只有一个实例,并且是自行实例化,向系统提供这个实例
      分类:
        饿汉式
          1.线程安全的
          2.类创建时就已经创建好一个静态对象
        懒汉式
          1.默认是非线程安全的
          2.属于延时加载,在需要时创建对象
          3.想要其实现线程安全的几种方式:
            a.在初始化对象的方法上加synchronized同步
            b.双重检查锁定
           **c.静态内部类(既实现了线程安全,又避免了同步带来的性能影响。)
      优点
        1.实例控制
           选择单例模式就是为了避免不一致状态,避免同一资源被两方调用,从而确保所有对象都访问唯一实例
        2.灵活性
           因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
      缺点
        1. 开销:每次对象引用时都要检查是否存在类的实例,需要一些开销。可以通过使用静态初始化解决此问题
        2. 对象的生存期:单例模式不能解决删除单个对象的问题。其他类不可以删除对象实例,但这样会导致单例类中出现悬浮引用。

      

      实现步骤:
        1.饿汉式:
          构造方法私有化--在内部定义一个静态常量--static修饰的getInstance中获取对象--测试类用“==”来判断对象是否指向同一内存区域
        2.懒汉式:
          ①在getInstance方法上加synchronized同步--判断引用是否为空--为空就创建对象--不为空就返回对象
          ②在getInstance方法内部先判断对象的引用是否为null--若为null再给该类添加synchronized同步--再判断引用是否为空
          ③在该类中添加静态内部类--内部类中愚静态常量初始化--该类的无参构造--getInstance方法中返回内部类掉静态常量

      应用:
        在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
      举例:
        每台计算机可以连接多个打印机,但是打印服务只有一个。
        为了避免两个打印请求同时输出到打印服务上,计算机要管理一些通信端口,避免一个通信端口同时被多个请求占用
      与其他设计模式的区别
      其他设计模式讲究的是对象之间的关系,而单例模式只有他本身一个对象

      参考链接:

        http://blog.csdn.net/jason0539/article/details/23297037/

        http://terrylee.cnblogs.com/archive/2005/12/09/293509.html

     


     

    工厂模式:

      概念:

        主要用来实例化有共同接口的类,可以动态的决定实例化哪一个类

      分类:
        1.简单工厂/静态工程
          概念:拥有必要的 逻辑判断能力 和 所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。
          好处:使用方便
          局限
            1.紧耦合--想要新产品,就要修改简单工厂类中的源码
            2.维护差--复杂逻辑判断能力仅仅if-else满足不了
            3.不安全--整个都依赖简单工厂类,一旦该类出现问题,系统将无法正常工作
          实现步骤
            为所有产品定义一个共同的产品接口--让这个工厂的所有产品都必须实现此接口--写一个工厂类,有它来负责生产以上的产品--测试下定单了,SimpleFactory将根据不同的定单类决定生产什么产品。
        2.工厂方法
          概念:为工厂类定义了接口,用多态来削弱了工厂类的职能
          好处:为了降低风险和为日后的维护、扩展做准备
          局限:当面对的产品有复杂的等级结构
          实现步骤
            定义一个工厂接口,一个产品接口--所有产品都实现产品接口--不同的产品工厂都实现工厂接口--在各个产品工厂类中创建对应产品的对象
          与简单工厂的区别
            如果相关联的产品只有一个,那么不需要对工厂对象进行抽象了。
            简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,

            这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。
        3.抽象工厂
          概念:在工厂方法的基础上引进了分类管理的概念,创建一系列互相关联或互相依赖的对象
          好处:产品分类成了抽象工厂的重点,应用抽象工厂之前,要先对创建的对象进行系统的分类,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.
          实现步骤:
            为不同类别的产品创建不同的接口--为这两个接口的具体产品创建实现类--定义工厂接口(里面的抽象方法是制造不同产品)--根据产品型号创建工厂并实现工厂接口--
          与工厂方法的区别:
            如果关联的产品有多个,可以将工厂类进行抽象。让具体创建业务相关类的工作交给子类实现。
            使用抽象工厂时,通常创建产品a和创建产品b的方法有一定的联系
            在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分
          优点:
            解耦
              当需要一个类的实例,如果用工厂模式的,只需要调用这个工厂方法,而不需要去关注如何产生这个类,

              有可能这个方法是直接new得到的,也有可能通过一些别的方法得到的,修改也只要修改这个工厂中的就行
          应用:如果一个对象拥有很多子类,那么创建该对象的子类使用工厂模式是最合适的,不但可以面向接口的编程,为维护以及开发带来方便。
          举例:汽车有很多牌子,型号;家电工厂
          与其他他设计模式区别:与单例的区别,工厂模式有多个对象

      参考链接:

        http://www.cnblogs.com/zhouqiang/archive/2012/07/20/2601365.html

     


    代理模式
      概念:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
      主题接口:要做的事,可以是接口或抽象类
      真实角色:去实现的人
      代理角色:对真实角色的调用,在其前后做预处理和善后工作
      分类
        1.静态代理:一个委托类对应一个代理类,代理类在编译期间就已经确定
        2.动态代理:代理类在程序运行时创建的代理方式
      优点:
        可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。
      实现步骤:
        1.创建抽象角色
        2.创建真实角色
        3.于代理类与委托类之间的中介类,也叫动态代理类,实现InvocationHandler接口(注入被单例对象)
        4.通过场景类,动态生成代理类(中介类实例,类加载器)
      与静态代理的区别:通过反射动态的生成代理类
      优点
        职责清晰 真实角色只需关注业务逻辑的实现,其他的都由代理类完成即可。
        高扩展性 不管真实角色如何变化,由于接口是固定的,代理类无需做任何改动。
      应用:控制用户和管理源权限
      举例

        如果某对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
      与其他设计模式的区别
        用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。

        当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。

        当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

      参考链接:

        http://www.importnew.com/26116.html

     


    观察者模式
      概念:观察者模式定义了 对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
      作用:
        观察者模式可以用来解耦,让主题和观察者之间耦合度降得很低
      举例:
        老师给学生布置作业,老师一布置作业,监听的学生都可以时时收到
      分类:
        自己实现的观察者模式:
          1、主题接口:

            * 是被观察者的行为
            * 实现的方法有:1.添加/2.删除观察者、3.当主题方法改变,调用notify方法,通知所有观察者

          2.观察者接口:

            * 当主题改变时会将改变的信息以字符串形式传入update方法的参数info,每个观察者都需要实现该方法

          3.被观察者实现类:

            * 属性:1.存放和记录观察者的list集合,2.记录改变的主题方法notify中的字符串
            * 重写主题接口方法:

              1,添加观察者到list集合中,

              2.如果集合中有该观察者名的个数大于等于0,则移除

              3.遍历观察者集合,获取每一个观察者,并将通知信息发给他们

              4.创建setXXXX方法,参数为主题要告诉观察者们的信息,最后调notifyObserver();更新状态
          4.观察者实现类:

            * 属性:

              1.引入声明被观察者实现类
              2.声明观察者name

                * 有参构造方法(传入被观察者实现类,观察者name),并将观察者对象(this)添加到被观察者了
                * 重写updae方法(表明观察者name已得到信息info)

          5.测试

              * 被观察者实现类对象--》多个观察者对象--》被观察者调setXXXX方法
        java内置的观察者模式:
          1.java.util包中包含有基本的Observer接口和Observable抽象类
          2.调用Observable对象的addObserver()方法.不想再当观察者时,调用deleteObserver()就可以了.
          3.被观察者(主题)发出通知
            第一步:先调用setChanged()方法,标识状态已经改变的事实.
            第二步:调用notifyObservers()方法或者notifyObservers(Object arg),这就牵扯到推(push)和拉(pull)的方式传送数据.

                如果想用push的方式"推"数据给 观察者,可以把数据当做数据对象传送给notifyObservers(Object arg)方法,

                其中的arg可以为任意对象,意思是你可以将任意对象传送给每一个观察者.如果调用不带参 数的notifyObserver()方法,

                则意味着你要使用pull的方式去主题对象中"拉"来所需要的数据.
          4.观察者如何接收通知:
            观察者只需要实现一个update(Observable o,Object arg)方法,第一个参数o,是指定通知是由哪个主题下达的,

            第二个参数arg就是上面notifyObserver(Object arg)里传入的数据,如果不传该值,arg为null.

     

      参考链接: 

          http://www.jianshu.com/p/0073e091b266
     
     

     

     

     

     

      

        

  • 相关阅读:
    利用print2flashsetup.exe文档转swf
    Linux 脚本内容指定用户执行
    第一讲:网络协议概述
    第三讲:ifconfig:最熟悉又陌生的命令行
    第2讲 | 网络分层的真实含义是什么?
    Fiddler -工具使用介绍(附:拦截请求并修改返回数据)(转)
    Fiddler 抓包工具总结(转)
    网络抓包wireshark(转)
    Axure RP 授权码
    第6堂视频课:看到词句就会读-下
  • 原文地址:https://www.cnblogs.com/ccEmma/p/7727687.html
Copyright © 2011-2022 走看看