标签:emd 通过 实现 driver prot ble 类继承 == new
包括:单例模式、建造者模式、原型模式、工厂模式
保证对象在一个jvm中,只有一个实例存在
适用场景:
分类:
饿汉式
懒汉式
双重检验锁
解决的问题:当两个线程同时执行到了
if(null == instance){ // A\B线程均执行到此处,判断instance为空。
...
}
两个线程会继续往下执行,那么内存中就存在了两个实例
静态内部类方式:可以同时保证延迟加载和线程安全
对一个原型类进行复制克隆产生新的对象
要求:被复制的对象需要实现Cloneable接口,和重写Object类中的clone方法;
好处:通过原型模式创建对象比直接new会有更好的性能,Object类的clone方法时一个本地方法,直接操作内存中的二进制流。
工厂方法模式
1、普通工厂模式
建立一个工厂类,对实现了同一个接口的一些类进行实例的创建
通过入参判断所需的是哪一个实体类,然后直接返回
2、多个工厂方法模式
提供多个工厂方法,分别创建对象
对不同的返回实例,编写不同的方法,根据方法调用返回实现了同一个接口的不同实例。
3、静态工厂方法模式(常用的模式)
将上面的多个工厂方法设置为静态的,无需创建实例就可得到所需类。
抽象工厂模式
创建多个工厂类,进一步提高了工厂的扩展性
对不同工厂的抽象和分类,使用的时候,根据自己所需选择对应的工厂类,进而获取到所需的实例
包括:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、亨元模式
1、类的适配器模式
需求:在一个接口类A中,存在方法methodA(),目前需要在methodA()中调用另一个类B的methodB().
实现:创建适配器类C继承B,实现A接口,重写methodA(),方法中调用super.methodB;
public class C extends B implements C{
@Override
public void methodA() {
//...一些操作...
super.methodB();
//...一些操作...
}
}
2、对象的适配器模式
与类适配器不同是,类适配器通过继承来完成适配,对象适配则是通过关联来完成。
public class C implements A{
// 适配者是对象适配器的一个属性
private B b = new B();
@Override
public void methodA() {
//...
b.B();
//...
}
}
3、接口的适配器模式
问题:有时候我们实现一个接口,但是不想实现里边无关的其他方法,就需要一个中间适配器,由中间适配器实现接口的所有方法,然后我们定义一个类继承这个适配器,只重写我们关心的方法即可。
package com.demo.adapter.interfaceadapter;
/**
* 接口类.
*/
public interface DCOutput {
int output5V();
int output9V();
int output12V();
int output24V();
}
package com.demo.adapter.interfaceadapter;
import com.demo.adapter.classadapter.AC220;
/**
* 适配器类.
*/
public abstract class PowerAdapter implements DCOutput{
protected AC220 mAC220;
public PowerAdapter(AC220 ac220){
this.mAC220 = ac220;
}
@Override
public int output5V() {
return mAC220.output220V();
}
@Override
public int output9V() {
return mAC220.output220V();
}
@Override
public int output12V() {
return mAC220.output220V();
}
@Override
public int output24V() {
return mAC220.output220V();
}
}
package com.demo.adapter.interfaceadapter;
import com.demo.adapter.classadapter.AC220;
/**
* 适配器的使用.
*/
public class Power5VAdapter extends PowerAdapter {
public Power5VAdapter(AC220 ac220) {
super(ac220);
}
@Override
public int output5V() {
int output = 0;
if (mAC220 != null) {
output = mAC220.output220V() / 44;
}
return output;
}
}
增强被装饰者的功能,要求装饰者和被装饰者实现同一个接口,装饰者持有被装饰者对象的实例
将一类相关的组件放到一个类里,并实现相关的方法;
public class Facade {
//被委托的对象
SubSystemA a;
SubSystemB b;
SubSystemC c;
SubSystemD d;
public Facade() {
a = new SubSystemA();
b = new SubSystemB();
c = new SubSystemC();
d = new SubSystemD();
}
//提供给外部访问的方法
public void methodA() {
this.a.dosomethingA();
}
public void methodB() {
this.b.dosomethingB();
}
public void methodC() {
this.c.dosomethingC();
}
public void methodD() {
this.d.dosomethingD();
}
}
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}
比如JDBC桥接DriverManager一样;JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要改动太多的代码,原因就是JDBC提供统一的接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。
主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,如数据库连接池。
包括:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
当一个对象变化时,其他依赖该对象的都对象都会收到通知,并且随着变化,对象之间是一种一对多的关系。类似邮件订阅和RSS订阅,当你订阅了该文章,如果后续有更新,会及时通知你。
有多个对象,每个对象都持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,知道某一个对象决定处理该请求。但是发出者并不清楚到底最终哪个对象会处理该请求,所以责任链可以实现在隐瞒客户端的情况下,对系统进行动态的调整。
当对象的状态改变时,同时改变其行为
中介者模式也是用来降低类之间耦合的,如果使用中介者模式,只需关心和中介类的关系,具体类和类之间的关系及调度交给中介类就行。
工厂类模式是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建符合对现象,所谓复合对象就是指某个类有不同的属性。
标签:emd 通过 实现 driver prot ble 类继承 == new
原文地址:https://www.cnblogs.com/xujie09/p/11626562.html