概述
基本含义不再详述
分类:一般根据目的划分为三类:创建型模式、结构型模式、行为型模式
- 创建型模式:解决“如何创建对象,将对象创建与使用分离”,包括单例、原型、工厂方法、抽象工厂、建造者模式
- 结构型模式:解决“如何将类或对象按某种布局组成更大的结构”,包括代理、适配器、桥接、装饰、外观、享元、组合
- 行为型模式:解决“类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责”,包括模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器
几大原则:
- 开闭原则:软件实体应当对扩展开放,对修改关闭,即当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求
- 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立(几维鸟不是鸟)
- 依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,核心即为面向接口编程
- 单一职责原则:对象不应该承担太多职责,核心就是控制类的粒度大小、将对象解耦、提高其内聚性
- 接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上,即接口中应不包含接口的实现者不需要的抽象方法
- 迪米特法则:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性
- 合成复用法则:软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
单例模式
应用场景:
- 某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等;
- 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web中的配置对象、数据库的连接池等;
- 当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。
实现代码:
public class Singleton {
private static Singleton singleton=null;
//避免在外部被实例化
private Singleton(){
};
public static synchronized Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}else{
System.out.println("已经被实例化了");
}
return singleton;
}
}
原型模式
含义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
应用场景:
- 对象之间相同或相似,即只是个别的几个属性不同的时候;
- 对象的创建过程比较麻烦,但复制比较简单的时候。
分类:
- 浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
- 深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
实现代码:
public class ProtoType implements Cloneable{
private int id;
private String name;
private AccProtoType accProtoType;
public ProtoType(){
};
public Object clone() throws CloneNotSupportedException {
return (ProtoType)super.clone();
}
}
测试代码:
//原型模式测试