设计模式部分整理

1.Builder模式
当对象的属性比较多,过于复杂时,首先要把可以聚合为一个对象的属性作为一个对象,然后这些和同一层级的属性作为这个类的属性。比如定义了一个模版,里面有检测器,取值器,又有设备属性等,那么这些同一层级的作为第一个对象的属性(也就是模版的),然后检测器等对象各自再有自己的属性(比如:图像啊,文本啊,怎么取,参考判断逻辑,而其中的参考判断逻辑又可以定义成一个对象,再单独对它的各个属性去初始化)。
当对象属性比较多时,我们可以构建多个构造函数,比如
template(A a,B b){
return template(a,b,0)
}
template(A a,B b ,C c){
return template(a,b,c,0)
}
template(A a,B b,C c,D d){
return template(a,b,c,d)
}
这样初始化时,可以只选择部分属性。但是这样属性初始化时顺序依赖很严重,尤其是如果参数的类型有部分相同时。所以也有用javaBean,就是set 去分别赋值,但是这样的话在构造过程中javaBean可能处于不一致的状态,因为构造过程被分到了几个调用中(通常是有不同的构造函数,同时提供获取或更改单一属性的set,get)。所以为了保证线程安全,这里可以采用builder设计模式。
public class Info{
private final int age;
private final int height;
private final String name;
private final String address;

public int getAge() {
    return age;
}

public int getHeigh() {
    return height;
}

public String getName() {
    return name;
}

public String getAddress() {
    return address;
}

public static class Builder {
    private int    age     = 0;
    private int    height  = 0;
    private String name    = null;
    private String address = null;

   // 构建的步骤
public Builder(String name) {
this.name = name;
}

    public Builder age(int val) {
        age = val;
        return this;
    }

    public Builder height(int val) {
        height = val;
        return this;
    }

    public Builder address(String val) {
        address = val;
        return this;
    }

    public Info build() { 
        return new Info(this);
    }
}

private Info(Builder b) {
    age = b.age;
    height = b.height;
    name = b.name;
    address = b.address;

}

}
在main()中初始化时,
Info info = new Info.Builder(“Jim”).age(25)
.address(“beijing”).build();
System.out.println(“name=” + info.getName() + “age =” + info.getAge()
+ “address” + info.getAddress());
这样,在初始化时,就会简单明了的说明了初始化了哪些信息(属性),而哪些是默认值。

2.策略模式
当我们有一个对象,它的通用属性可以确定,但是部分还有些特殊属性,比如“鸟”,有嘴,有翅膀,但是只有部分会飞,而有的飞的高,有的飞的低,部分会游泳,部分叫的动听,甚至部分会学人说话。
那么我们首先定义“鸟”这个对象时,只能定义嘴和翅膀这两个属性,然后其他“鸟”会extend这个基类。同时也可以extend飞的接口或者叫的接口。然后对接口有不同的实现,比如飞的接口可以实现飞的高的,飞的低的。叫的接口可以实现叫的动听的,会学人说话的。那么当你想初始化的对象是一只飞的低的又会学人说话的鸟时,就继承基类同时继承两个接口,而接口里的具体实现复用已经做好的飞的低的接口和学人说话的接口就可以了。换其他类型的鸟只需要复用不同的接口或者增加接口新的实现。
3.工厂模式
这个一般是调用log4j,或者constan类里的属性配置时(比如redis),我们为了只初始化一个对象(配置没必要总是创建新的,它是固定的)所以,经常是调用对应的静态工厂类。同时我们如果自己有固定的对象,也可以创建一个静态工厂类,代替构造函数,避免因为多次new,增加无用的内存开销。
4.单例模式
这个数据库连接时经常用,不过通常是用连接池自动控制,比如C3P0,还有就是用第三方包需要初始化对象,但是其实只要有一个就可以了,那么就在初始化方法里加一个If it==null 再初始化的判定。
5.适配器
这个最常用了,开发项目的过程中我们会定义很多model,但是随着迭代过程,有些后续的接口需要的参数不能从model的属性直接获取,那为了方便又不改动之前的model(避免影响之前的其他代码),再创建一个新的接口,接口里的参数是之前的model,然后计算出新接口需要提供的属性。这样后续开发也不用每次都重新计算或者获取,但是对依赖之前的model设计的方法也不会产生影响。

原文地址:https://www.cnblogs.com/zhangdebin/p/5567885.html