大话设计模式(5) --- 建造者模式|观察者模式|抽象工厂

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();
    }
}
建造者模式

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();
    }
}
观察者模式
观察者模式

3. 抽象工厂模式

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类

  • 改变一个应用的具体工厂十分容易,只需改变具体工厂即可使用不同的产品配置
  • 缺点:开发和修改需要改动很多类,增加了代码量
抽象工厂模式

3.1 优化一:简单工厂+抽象工厂

简单工厂+抽象工厂
  • DataAccess类中对具体的方法进行选择
  • 修改时在DataAccess中增加switch-case分支

3.2 优化二:反射+抽象工厂

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容