软件构造学习笔记:面向可维护性的设计模式

关于如何“创建类的新实例”的模式

工厂方法模式

当客户端不知道或者不确定要创建哪个具体的类的实例,或者不想在客户端中指明要具体创建哪个实例的时候,使用工厂方法。定义一个用于创建对象的接口,让该接口的子类型来决定到底实例化哪一个类,从而使一个类的实例化延迟到其子类。

有新的具体产品类加入时,可以增加新的工厂类或修改已有工厂类,不会影响客户端代码(OCP)
工厂方法的操作步骤:
1:创建抽象工厂类,定义具体工厂的公共接口。
2:创建抽象产品类,定义具体产品的公共接口。
3:创建具体产品类
4:创建具体工厂类(继承抽象工厂)
5:从外界调用具体的工厂类的方法,从而创建各个不同的具体产品。

工厂方法的优点:
更加符合开-闭原则(当新的产品增加时,只需要增加相应的产品类和相应的工厂子类即可。)
符合单一职责的原则。(每个具体工厂只负责对应的产品)
能解决类简单工厂模式无法继承等级结构问题(将静态工厂里的工厂类用继承的方式细分)

缺点:
会造成大量的类,增加开发的周期和成本

抽象工厂模式

抽象工厂模式:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体的实现类
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂创建的不是一个完整的产品,而是一个产品族(可以理解为一个套餐)产品的创建对客户端可见,但客户端只能选择开发者已经搭配好的套餐A或者套餐B,不能够自由搭配,防止了客户端因为不知道搭配,而使用错误。
在这里插入图片描述

代理模式

代理模式的运用能够在具体的应用中让某些不想要泄露的对象信息不被客户端访问到。代理模式像是一道防火墙,保护私密的对象信息不至于泄露。
代理模式分为三种方法
远程代理:
远程代理在本质上就是缓存机制,如果信息不会一直变化,那么缓存能够多次命中,有效提高访问的速度。
虚拟代理:
虚拟代理是根据实际的需要创建开销很大的对象,如果这个对象不会被经常访问,虚拟代理能够延迟创建。
保护代理:
通过创建代理,不直接访问实际对象。保护代理通过设置委托的方式访问对象。

观察者模式

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者模式的操作:
1.维护订阅者列表
2.定义update的协议
3.维护数据,修改后统治订阅者
4.得到通知后,修改自身的状态

public class Subject{
    private List<Observer> observers = new ArrayList<Observer>();
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) { 
        this.state = state; 
        notifyAllObservers();
    }
    public void attach(Observer observer){
        observers.add(observer);
    }
    private void notifyAllObservers(){
        for (Observer observer : observers) { 
            observer.update();
        }
    }
}

访问者模式

对特定类型object的特定操作(visit),在运行时将二 者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类
本质上:将数据和作用于数据上的某种/些特定操作分离开来。为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码 可以在不改变ADT本身的情况下在需要时通过delegation接入ADT。

visitor是在外部的角度,增加一些对ADT的灵活操作。

public class ShoppingCartClient {
public static void main(String[] args) {
ItemElement[] items = new ItemElement[]{ 
new Book(20, "1234"),new Book(100, "5678"), new Fruit(10, 2, "Banana"), new Fruit(5, 5, "Apple")};
int total = calculatePrice(items);
 System.out.println("Total Cost = "+total);
}
private static int calculatePrice(ItemElement[] items) { ShoppingCartVisitor visitor = new ShoppingCartVisitorImpl(); 
int sum=0; 
for(ItemElement item : items) sum = sum + item.accept(visitor);
 return sum; }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值