整体来讲设计模式分为三大类:spring
建立型模式:数据库
单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。设计模式
结构型模式:安全
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。app
行为型模式:iphone
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。ide
单例模式测试
单例模式的八种写法this
一、饿汉式(静态常量)[可用]spa
二、饿汉式(静态代码块)[可用]
三、懒汉式(线程不安全)[不可用]
四、懒汉式(线程安全,同步方法)[不推荐用]
五、懒汉式(线程安全,同步代码块)[不可用]
六、双重检查[推荐用]
七、静态内部类[推荐用]
八、枚举[推荐用]
简单工厂
又叫作静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该建立哪个产品类。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个惟一的标识来得到Bean对象,可是否是在传入参数后建立仍是传入参数前建立这个要根据具体状况来定。
工厂方法模式
public abstract class AbstractDriverFactory { public abstract Animal createDriver();//这个方法是为了它的子类重写它的构造方法 } public class ZhangFactory extends AbstractDriverFactory { @Override public Driver createDriver() { return new Zhang();//返回一个具体的对象老张。 } } public static void main(String[] args) { ZhangFactory zf = new ZhangFactory();//建立老张的工厂对象 Driver driver = zf.createDriver();//再调用建立司机的方法 driver.driveCar();//司机去开车 }
不得不说,工厂方法模式虽然完美符合了ocp开闭原则(Open Closed Principle)原则,但却使整个程序变得很沉重。就拿数据库来讲,若是有100个访问数据库的类,那么就要建立100个这个类的工厂。
1.简单工厂模式:最大的优势就是在工厂中就包含了必要的判断,使用时只须要根据客户端的选择来实例化便可,对于客户端使用来讲,去除了与具体产品的依赖。而缺点就是违背的ocp原则。假如将来要添加一个新的需求,则须要更改简单工厂中的判断语句。这对代码自己就不利。
2.工厂方法模式:最大的优势就是抽象化了简单工厂模式。再有新的需求进来时,不须要更改工厂的内容,符合了ocp原则。而缺点是每增长一个产品就要新增长一个相应的实例化工厂,增长了额外的开发量。
3.抽象工厂模式:分离了具体的类。不会出如今客户端代码中,易于交换产品系列。并且具体的工厂类只在它初始化的时候才会出现。这使得改变一个应用的具体工厂变得很容易~~缺点是,抽象工厂几乎肯定了能够建立的对象的集合。加入新的类型对象就须要扩展其接口,这将涉及到具体工厂及其子类的修改。
三种工厂模式虽然用法各不相同,但它们的最终目的都是一致的----解耦。spring容器就是个大型的抽象工厂,不只能够建立普通的bean实例,也能够建立bean工厂。
适配器模式
将一个类的接口转换成客户但愿的另外一个接口。适配器模式让那些接口不兼容的类能够一块儿工做,说白了就是为了挂羊头卖狗肉而专门设计的模式。也就是把一个类的接口变换成客户端所期待的另外一种接口。
1 ,类的适配
(1)目标(Target)角色:这就是所期待获得的接口。注意:因为这里讨论的是类适配器模式,所以目标不能够是类。
(2)源(Adapee)角色:如今须要适配的接口。
(3)适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不能够是接口,而必须是具体类。
2, 对象的适配
对象的适配依赖于对象的组合,而不是类适配中的继承。
仍是以手机为例子,每一种机型都自带有从电器,有一天自带充电器坏了,并且市场没有这类型充电器可买了,怎么办?万能充电器就能够解决,这个万能充电器就是适配器。
首先来一个IPhone的充电器类(Adaptee角色):
public class IPhoneCharger { public void applePhoneCharge(){ System.out.println("The iPhone is charging ..."); } }
要对这个特殊的充电器进行适配,上个适配的接口(Target角色):
public interface ChargeAdapter { public void phoneCharge(); }
由于适配有两种,因此先进行类的适配示例,建立类的适配器:
public class UniversalCharger extends IPhoneCharger implements ChargeAdapter{ @Override public void phoneCharge() { System.out.println("The phone is charging, but which kind of phone it is, who cares ..."); super.applePhoneCharge();//iphone charging } }
这就是万能充电器了,咱们让它来充个电,测试类准备:
public class AdapterClassTest { public static void main(String[] args) { ChargeAdapter charger = new UniversalCharger(); charger.phoneCharge(); } }
测试结果:
The phone is charging, but which kind of phone it is, who cares ... The iPhone is charging ...
以上是类的适配,咱们还有种对象的适配方式,建立对象的适配器:
public class UniversalCharger implements ChargeAdapter{ IPhoneCharger iphoneCharger; public UniversalCharger(IPhoneCharger iphoneCharger){ this.iphoneCharger = iphoneCharger; } @Override public void phoneCharge() { System.out.println("The phone is charging, but which kind of phone it is, who cares ..."); iphoneCharger.applePhoneCharge(); } }
对象适配器建立完毕,测一下:
public class AdapterObjectTest { public static void main(String[] args) { IPhoneCharger iphoneCharger = new IPhoneCharger(); ChargeAdapter charger = new UniversalCharger(iphoneCharger); charger.phoneCharge(); } }
测试结果:
The phone is charging, but which kind of phone it is, who cares ... The iPhone is charging ...
总结一下:
(1)类的适配器模式:当但愿将一个类转换成知足另外一个新接口的类时,可使用类的适配器模式,建立一个新类,继承原有的类,实现新的接口便可。
(2)对象的适配器模式:当但愿将一个对象转换成知足另外一个新接口的对象时,能够建立一个包装类,持有原类的一个实例,在包装类的方法中,调用实例的方法就行。