几种常见的设计模式

###单例模式
饥汉模式——饱汉模式——双重锁模式(多线程)

####饥汉模式:加载的就创建parm

1
2
3
4
5
6
class A {
static Object parm = new Object();
public static Object instance() {
return parm;
}
}

####饱汉模式:用的时候再创建parm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A {
static Object parm;
public static Object instance() {
if(parm == null) {
parm = new Object();
}
return parm;
}
}
···

####双重锁模式:在饱汉模式的基础上加同步锁,防止多个线程同时访问parm
```java
class A {
static Object parm;
public static Object instance() {
if(parm == null) {
synchronize(parm) {
parm = new Object();
}
}
return parm;
}
}

###简单工厂模式:一个工厂,很多生产线,可以产出某一类的产品,不需知道生产过程
简单理解工厂模式:给Factory一张图纸,Factory用自己的部件,经过生产线产出Product

1
2
3
4
5
6
7
8
9
class ToyFactory {
public static Toy produceToy(String toyType) {
if (toyType.equals("car")){
return new Car();
} else if (toyType.equals("plane")){
return new Plane();
} //根据图纸进行分类,让不同生产线生产不同的product
}
}

###代理模式:租户和房主之间的黑中介,中介有很多小动作

1
2
3
4
5
6
7
8
9
10
11
12
13
class Homeowner {
getRent() {}
}

class Proxy {
calculateCleanFee() {}
getRent() {
double cleanFee = calculateCleanFee();
return rent + cleanFee;
}
}
Proxy p = new Proxy();
people.getRent();

###装饰模式:和继承差不多,只不过继承是针对类,而装饰模式是针对对象
根据需要往一个对象中添加装饰组件(功能函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Class Coffe extends Water {
public void getPrice() {}
}
Class Milk extends water {
Water water;
Milk(Water w) {
water = w;
}
getPrice() {
return water.getPrice() + 30;
}
}

Coffe coffe = new Coffe();
coffe = new Milk(coffe);

###策略模式: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。
这样在使用的时候,只需要 InterFace A = new ClassFromInterface(),在不同的context中new不同的算法类,这样代码就会很灵活。

###模板模式:和策略模式差不多,只是模板模式会有个主要的骨干(主要业务流程),但骨干的具体实现需要调用的地方去实现。
比如我有一个算法,f(x, y) = (x+y)*y, 用模板模式先执行加法,然后乘法,具体如何加,如何乘不关心。

1
2
3
4
5
6
public void test(x, y) {
int res = Add(x. y);
int result = Muit(res, y);
}

public int Add(x, y) { return x+x+y+y }

####每个设计模式都有类图,可以去网上搜来帮助理解。