dream_sky




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

常用设计模式

  • 工厂方法:

工厂模式定义:实例化对象,用工厂方法代替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模式. 

 

posted @ 2018-06-08 20:41  书晨007  阅读(301)  评论(0编辑  收藏  举报
将时间精确到分,将获得较高的效率!