高内聚,低耦合,可维护,可读性
Single Responsibility
一个类应该只负责一项单一的职责
Interface Segregation Priciple
一个类对另一个类的依赖应该建立在最小的接口上。客户端不应该依赖它不需要的接口。
如果一个接口的一部分被A依赖,另一部分被B依赖,这个时候应该把接口拆分成两个字接口,实现接口隔离原则,减少冗余代码。
Dependence Inversion Priciple
依赖关系传递的三种方式:
依赖倒转原则的注意事项和细节:
如果对每个类型为T1对对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2室类型T1点字类型。换句话说:所有引用基类的地方必须能透明地使用其子类的对象。
使用继承的时候,子类尽量不要重写父类的方法。
里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题。
聚合:整体和部分的关系,可以分开。成员类可以脱离整体对象存在。汽车这个类包含引擎类
组合:整体和部分的关系,不可以分开。一旦整体不存在,成员类也不可以存在。例如某公司的某个部门,公司倒闭了,部门也不存在了。
依赖:A类的对象作为B类的一个成员变量
Open Close Principle:是编程中最基础,最重要的设计原则。
Demeter Principle:最小知道原则,一个类对自己依赖的类知道的越少越好。除了对外暴露public方法,不对外泄露任何信息。只和直接朋友进行通讯。
尽量使用聚合,合成, 而不是使用继承
Dependency: 依赖(使用)。只要一个类在类中用到了对方,方法返回值,方法参数,函数中的局部变量。
Association: 关联(一对多; 一对一; 双向一对一)。一个人和一个身份证是一一对应的。如果人这个类中有身份证类,身份证类中也有人这个类,那么他们关系是双向的。
Generalization: 泛化(继承)
Realization: 实现
Aggregation: 聚合 (通过set方法传入别的类,称为聚合)。如果A类中可以有多个B类,就是多聚合,否则就是单聚合(一台电脑可以有多个内存)。聚合类可以分开,例如鼠标可以离开电脑存在。
Composite: 组合(当B类被实例化的时候,A类也被实例化的时候,称为组合)。如果类创建的时候自动创建了别的类,则是组合关系。例如:
public class A {
private B b = new B();
}
public class B {
}
这种情况下,A创建的时候,B直接被创建,所以是共生死的,所以是组合关系。如果删除的时候进行极联删除,那么就是组合关系。
保证整个软件中,某个类只能存在一个对象实例。并且该类只提供一个取得其对象实例的方法(静态方法),比如 ConnectionFactory,SessionFactory。
class type1 {
//饿函式 静态成员变量
private static type1 instance = new type1();
private type1() {
};
public static type1 getInstance() {
return instance;
}
}
class type2 {
//饿汉式 静态代码块
private static type2 instance;
static {
instance = new type2();
}
private type2() {
};
public static type2 getInstance() {
return instance;
}
}
class type3 {
//懒汉式
private static type3 instance;
private type3() {
};
public static type3 getInstance() {
if (instance == null)
instance = new type3();
return instance;
}
}
class type4 {
//懒汉式
private static type4 instance;
private type4() {
};
public static type4 getInstance() {
if (instance == null)
synchronized (type4.class) {
instance = new type4();
}
return instance;
}
}
多个线程进入if语句后,好几个线程都会创建instance,线程不安全,不能使用!
class type5 {
//懒汉式 线程安全 double check
private static volatile type5 instance;
private type5() {
}
public static type5 getInstance() {
if (instance == null)
synchronized (type5.class) {
if (instance == null)
instance = new type5();
}
return instance;
}
}
写一个静态内部类,该类中有一个静态属性 Singleton
属于懒汉式,外部类的加载不会导致静态内部类的加载
class type6 {
//静态内部类
private type6() {
}
private static class SingletonInstance {
private static final type6 INSTANCE = new type6();
}
public static type6 getInstance() {
return SingletonInstance.INSTANCE;
}
}
可以防止反序列化重新创建新的对象
class type7 {
//枚举
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
Singleton instance2 = Singleton.INSTANCE;
System.out.println(instance == instance2);
}
}
enum Singleton {
INSTANCE;
public void sayOK() {
System.out.println("ok ");
}
}
工具类,数据源,重量级对象等都可以使用单例模式
属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式也叫做静态工厂模式
public static Object createObject() {
}
定一个抽象类class来表示factory,具体的实例化对象操作下放到子类(继承这个抽象类的类)实现。
把抽象的类换成interface,最顶层是抽象接口,多个子类工厂族来实现不同的对象实例化。
interface AbstractFactory {
createObject() }
class SubFactory1 implements subFactory1 {
createObject() }
class SubFactory2 implements subFactory2 {
createObject() }
/**
* 使用的时候只需要传入一个具体的实现子类,然后通过其来实例化对象,而使用层面只需要用interface来表明需要使用的类,可以减少代码修改量
**/
public static void main(String[] args) {
//如果想用子工厂1来创建对象
createBean(new SubFactory1);
//如果想用子工厂2来创建对象
createBean(new SubFactory2);
}
// 这样写的好处是,createBean的函数主体不需要更具工厂族的变化而变化
public static Object createBean(AbstractFactory a)