zoukankan      html  css  js  c++  java
  • 常用设计模式

    • 工厂方法:

    工厂模式定义:实例化对象,用工厂方法代替new操作.,通过定义一个工厂类,传入不同的参数(或者class对象)返回不同的对象,对象继承的接口。

    使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量

    而这些汽车的组件是与调用者无关的,严重违反了迪米特法则耦合度太高,给工厂指令,返回具体。

    举例来说,如果直接new实现某接口的对象,将来要对接口进行重新做实现(起个新的类名),
    假如你在100个地方调用了new,则你有100个地方要改

    抽象工厂模式:分别建立形状工厂和颜色工厂,先调用不同的工厂,在返回不同的对象。

    • 单例方法:

    某个类只需要创建一个对象,比如读取配置文件,每次使用配置文件减少new对象,保证同步性。(懒汉式,为空才创建,不可取。饿汉式,初始化就创建,可取。)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //创建 SingleObject 的一个对象
    private static SingleObject instance = new SingleObject();
    //让构造函数为 private,这样该类就不会被实例化
    private SingleObject(){}
    //获取唯一可用的对象
    public static SingleObject getInstance(){
       return instance;
    }
    1
    2
    3
    4
    5
    //通过反射破坏单例模式,创建两个对象。
    Constructor constructor = aClass.getDeclaredConstructor(null);
    constructor.setAccessible(true);
    SinglePattern singlePattern1 = (SinglePattern) constructor.newInstance();
    System.out.println(singlePattern1.getAnimal(3));
    <wiz_tmp_tag class="wiz-block-scroll">
     

    解决方式:

    1、反射创建第二个实例时抛出异常,防止实例化多个对象。构造函数中的synchronized是为了防止多线程情况下实例化多个对象

    1
    2
    3
    4
    5
    6
    synchronized (Singleton.class) {
          if(count > 0){
              throw new RuntimeException("创建了两个实例");
          }
          count++;
      }

    2、使用枚举类型。

    1
    2
    3
    4
    5
    public enum Singleton { //枚举类型不能new,通过类名访问。
        INSTANCE; 
        public static void whateverMethod() { 
        
    }
    • 策略模式:(类似工厂模式)

    简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用。即客户端使用的是工厂类生产的产品对象。

    策略模式:客户端创建一个Context类对象a(可以看作是工厂模式中工厂类),创建一个策略对象(具体实现)并传参给对象a(构造方法),然后客户端使用a对象的某些方法来使用前面传参进来的策略,即客户端是通过a对象使用策略的。(向策略类(即工厂类)传入不同的操作类,操作类用策略接口接收,操作类同一方法,不同实现。两个数字的crud操作)

    简单的说,

    1、工厂模式根据条件生产出产品给客户端用。而策略模式是客户端使用传参给Context的策略(你也可以理成产品),传入策略的不同,调用同样方法得到的结果也不同。

    2、工厂模式:客户端是使用工厂类生产的对象进行操作,策略模式:客户端使用自己传给Context的策略的对象进行操作。

    创建型模式和行为型模式,策略更偏向于不同的类有不同的算法,银行存款选择定期一年,定期两年利息的算法。

    3、一个返回对象,一个传入对象。

    与代理类:

    代理类与被代理类实现的是同一个接口

    策略类容器并没有实现与内部策略相同的接口

    • 装饰器:

    使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

    一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

    在不想增加很多子类的情况下扩展类。

    是策略模式的延伸,在策略Context方法中,增加扩展原有的方法(类似继承context方法,扩展新功能。Context实现接口,装饰器继承context)。

    策略模式更倾向是N选1的模式

    • 观察者模式:

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

    在抽象类里有一个 ArrayList 存放观察者们

    一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

    通常一个实体的属性改变时,通知所有使用这个实体的类。将一个实体定义在抽象类中,使用者继承抽象类。

    • 模板模式:

     1、有多个子类共有的方法,且逻辑相同。

     2、重要的、复杂的方法,可以考虑作为模板方法。

    在抽象类中定义子类的公共方法,设置为final类型,不能被重洗。

    public final void ddo(){//三个抽象的方法子类都实现了。

    initialize();
    startPlay();
    endPlay();  

      System.out.println("dodo");//定义公共的方法或动作,继承了这个类的都将共享方法。

    }

    • 命令模式(Command): 将一个请求封装成为一个对象,  使可以用不同的请求对客户进行参数化. 


    比如Struts的MVC结构, 其实就是个Command模式. 

    1、将通过毅力完成的事转化为习惯。
    2、清心寡欲、方能高枕无忧。
    3、纸上得来终觉浅,绝知此事要躬行。

    种一棵树最好的时间是 十年前。 其次是, 现在!

  • 相关阅读:
    Java开源内容管理CMS系统J4CMS支持静态化直接ftp上传到你的空间了
    JAVA数组的定义及用法
    从本地上传整个目录到hdfs的java程序
    图片轮显效果大全
    Windows 自己主动关机命令 shuntdown
    Android源码是这样搞到的(图解)
    JSONObject与JSONArray的使用
    教你用笔记本破解无线路由器password
    tomcat配置文件server.xml具体解释
    SQLite的SQL语法
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9157510.html
Copyright © 2011-2022 走看看