1. 建造者模式
建造者模式适用于将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示的意图时
public abstract class PersonBuilder {
protected Color color;
public PersonBuilder(Color color) {
this.color = color;
}
public abstract void drawHead();
}
public class PersonThinBuilder extends PersonBuilder {
public PersonThinBuilder (Color color) {
super(color);
}
@Override
public void drawHead() {
System.out.println("ThinPerson Head");
}
}
public class PersonDirector {
PersonBuilder personBuilder;
public PersonDirector(PersonBuilder pb) {
this.personBuilder = pb;
}
public void createPerson() {
personBuilder.drawHead();
}
}
public class ClienDraw {
public static void main(String[] args) {
PersonDirector personDirector = new PersonDirector(new PersonThinBuilder(Color.BLACK));
personDirector.createPerson();
}
}
![](https://img.haomeiwen.com/i14092234/55e9fb9fd44d5321.png)
2. 观察者模式
观察者模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自己更新自己
- 观察者模式让双方都依赖于抽象,而不是依赖于细节,从而使得双方的变化都不会影响到对方
- 使用场景:当一个对象的改变需要同时改变其他对象时,而且他不知道有多少需要改变
- 需要维护相关对象间的一致性
- 当被通知者所需要调用的方法名不一样时,观察者模式不太方便
public abstract class Subject {
abstract void attach(Observer observer);
abstract void detach(Observer observer);
abstract void notifyColleagues();
}
public abstract class Observer {
public String name;
public Subject sub;
public Observer(String name, Subject sub) {
this.name = name;
this.sub = sub;
}
public abstract void updateMyState();
}
import java.util.ArrayList;
public class Boss extends Subject {
ArrayList<Observer> observerArrayList = new ArrayList<>();
String myState = "老板来了";
@Override
void attach(Observer observer) {
observerArrayList.add(observer);
}
@Override
void detach(Observer observer) {
observerArrayList.remove(observer);
}
@Override
void notifyColleagues() {
for(Observer o: observerArrayList) {
System.out.println(o + myState);
}
}
}
public class Staff extends Observer {
public Staff(String name, Subject sub) {
super(name, sub);
}
@Override
public void updateMyState() {
System.out.println("已经收到通知");
}
}
public class ObservationClient {
public static void main(String[] args) {
Boss boss = new Boss();
boss.attach(new Staff("张三", boss));
boss.myState = "老板回来了";
boss.notifyColleagues();
}
}
![](https://img.haomeiwen.com/i14092234/a6fa372d7b94c90e.png)
![](https://img.haomeiwen.com/i14092234/28def236586ea76b.png)
3. 抽象工厂模式
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
- 改变一个应用的具体工厂十分容易,只需改变具体工厂即可使用不同的产品配置
- 缺点:开发和修改需要改动很多类,增加了代码量
![](https://img.haomeiwen.com/i14092234/836d9adf8db31707.png)
3.1 优化一:简单工厂+抽象工厂
![](https://img.haomeiwen.com/i14092234/d870ea0ba4c9e14f.png)
- 在
DataAccess
类中对具体的方法进行选择 - 修改时在
DataAccess
中增加switch-case
分支
网友评论