初学设计模式,建议可以参考菜鸟教程,里面讲的很详细,这里我总结一下设计模式的六大原则和创建型模式:
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等。
2、里氏替换原则(Liskov Substitution Principle)
面向对象设计的基本原则之一,是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。在进行设计的时候,我们应该尽量从抽象类继承,而不是从具体类继承.如果从继承等树来看,所有叶子节点应当是具体类,而所有的树枝节点应当是抽象类或者接口.当然这只是一个一般性的指导原则,使用的时候还要具体情况具体分析。
3、依赖倒转原则(Dependence Inversion Principle)
这个是面向对象设计的核心原则,具体内容:针对接口编程,不针对实现编程。依赖于抽象而不依赖于具体。写代码用到具体类时,不与具体类交互,而与具体类的上层接口交互。
4、接口隔离原则(Interface Segregation Principle)
每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
5、迪米特法则(最少知道原则)(Demeter Principle)
一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。即一个软件实体应当尽可能少地与其他实体发生相互作用,通过中间类建立联系。
6、合成复用原则(Composite Reuse Principle)
原则一句话:是尽量首先使用合成/聚合的方式,而不是使用继承。
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,它不属于23种GOF设计模式,但是可以被认为是一种特殊的工厂方法模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类。
应用:
简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,在简单工厂中,创建对象的是另一个类,而在工厂方法中,工厂父类负责创建对象的公共接口,工厂子类来创建具体的对象。
适用场景:
优缺点:
应用:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
适用场景:
优缺点:
在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。
单例模式的实现有懒汉式(线程不安全)、饿汉式(线程安全,一开始就直接实例化),静态内部类实现等。
静态内部类实现:
使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕,避免出现 JVM 具有指令重排的特性。
public class Singleton {
/* 私有构造方法,防止被实例化 */
private Singleton() {
}
/* 此处使用一个内部类来维护单例 */
private static class SingletonFactory {
private static Singleton instance = new Singleton();
}
/* 获取实例 */
public static Singleton getInstance() {
return SingletonFactory.instance;
}
/* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
public Object readResolve() {
return getInstance();
}
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
如Java中的StringBuilder类的实现就是应用这种模式。
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
关键代码:实现克隆操作,在 JAVA 实现 Cloneable,重写 clone();
优点:
缺点:
参考资料: