如何做虚拟币交易网站,优秀集团网站,北京软装设计公司前十名,运维兼职平台不要担心冗长#xff0c;3分钟解决面试和学习问题#xff0c;收藏再看
目的#xff1a;当作一种模板#xff0c;结合自身特点#xff0c;针对项目需求来使用
目录
单例模式
特点#xff1a;
实现方式#xff1a;
1、饿汉式
2、线程安全的懒汉式
3、双重校验锁 使…不要担心冗长3分钟解决面试和学习问题收藏再看
目的当作一种模板结合自身特点针对项目需求来使用
目录
单例模式
特点
实现方式
1、饿汉式
2、线程安全的懒汉式
3、双重校验锁 使用经验
工厂模式
特点
实现方式
1、简单工厂模式
2、工厂方法模式
3、抽象工厂模式
编辑
使用经验:
适配器模式
组成
特点
实现方式
编辑
使用经验
代理模式
特点
实现方式
1、静态代理
2、动态代理
编辑
使用经验
观察者模式
特点
实现方式
编辑
使用经验: 单例模式
特点
整个程序该类 唯一实例化对象统一管理调度避免资源多重占用节省内存开销节省性能开销
实现方式
1、饿汉式
先初始化好变量需要时直接返回 //Kotlin
object Singleton//Java
public class Singleton{private Singleton(){}private static Singleton instace new Singleton();public static Singleton getInstance(){return instance;}
}2、线程安全的懒汉式
使用同步锁解决懒汉式线程安全问题 //Kotlin
Class Singleton private constructor(){private var instance:Singleton? nullfun get():Singleton{if (instance null){synchronized(this){if (instance null){instance Singleton()}}}return instance!!}
} //Java
public class Singleton{private Singleton(){}private static Singelton instance;public static sychronized Singleton getInstance(){if(instancenull){instance new Singleton();}return instance;}
}3、双重校验锁
考虑线程安全基于同步锁来创建并返回唯一实例对象
//Kotlin
companion object{val instance:Singleton by lazy(mode LazyThreadSafetyMode.SYNCHRONIZED) {Singleton()}
}//Java
public class Singleton{private volatile static Singleton instance;private Singleton(){}public static Singleton getInstance(){if(instace null){synchronized(Singleton.class){if(instance null){instance new Singleton();}}}return instance;}
} 4、静态内部类
静态提供单个实例实例通过内部类创建
//Kotlin
class Singleton private constructor(){companion object{val instance SingletonHolder.holder}private object SingletonHolder{val holder Singleton()}
}//Java
public class Singleton{private static class SingletonHolder{private static Singleton instance new Singleton();}private Singleton(){}public static Singleton getInstance(){return SingletonHolder.instance;}
}使用经验
线程安全和性能要求高 使用饿汉式、双重检查锁需要保证创建单例是第一次访问时使用了懒汉式、静态内部类
工厂模式
特点
不直接实例化对象通过工厂创建对象
实现方式
1、简单工厂模式
只创建一个工厂工厂可以产多个产品利用接口实现统一
接口 interface ICar {fun printColor()fun installEngine()fun installWheels()fun installSystem()fun doit()
} 产品类: class CarA :ICar {private lateinit var color: Stringprivate lateinit var engine:Stringprivate lateinit var wheels:Stringprivate lateinit var system:Stringoverride fun printColor() {color redprintln(it is red)}override fun installEngine() {engine EngineAprintln(it is $engine)}override fun installWheels() {TODO(Not yet implemented)}override fun installSystem() {TODO(Not yet implemented)}override fun doit(){printColor()installEngine()}override fun toString(): String {return $color$engine}
} 工厂类 class SimpleFactory {companion object{val CAR_A CarAval CAR_B CarBfun buildCar(type:String):ICar?{var car:ICar? nullwhen(type){CAR_A- car CarA()CAR_B- car CarB()}car?.doit()return car}}
} 通过工厂创建 val A SimpleFactory.buildCar(SimpleFactory.CAR_A) 输出结果 2、工厂方法模式
多产品类对应多工厂所有产品类对应一个接口统一产品大致操作所有工厂类对应一个接口统一工厂的大致操作如“生产产品”
产品接口 interface ICar {fun printColor()fun installEngine()fun installWheels()fun installSystem()fun doit()
} 工厂接口 interface IFactory {fun buildCar():ICar
} 工厂类同简单工厂模式一致
新增产品类如CarC同样实现ICar接口创建对应工厂C来实现IFactory接口 class CCarFactory:IFactory {private val carC CarC()override fun buildCar(): ICar {carC.doit()return carC}
}3、抽象工厂模式
有多个工厂一个工厂可以生产多种产品工厂间一个接口统一同类产品间一个接口统一
多产品统一接口 多个工厂接口统一: 使用经验:
第一关注接口同类产品共有方法放产品接口工厂要生产哪几类产品的方法放同一工厂接口固定永远只有几种产品。使用简单工厂随时新建工厂生产新产品。使用工厂方法一个工厂可以生产不同种类产品。使用抽象工厂
适配器模式
不修改现有代码将不兼容的类组合在一起
组成
目标接口 Target Interface适配器 Adapter 充当两个不兼容接口间的桥梁适配者 Adaptee 需要被适配的对象该接口与目标接口不兼容客户端 Client 使用目标接口的对象
特点
当需要将一个已有的类或接口与另一个不兼容的类或接口进行协同工作时当需要对一个已有的类或接口进行修改以满足客户端的需求时但是不希望修改该类或接口的源代码当需要重新使用一个已有的类或接口但是不能直接使用该类或接口的方法时
实现方式 使用经验
由适配器来间接调用适配者方法适配者无需实现目标接口只需要当作参数或成员变量来传入适配器Java IO流每个数据源都有不同接口但是Java IO可以将它们转为统一标准接口Java Servlet API 定义一组接口处理HTTP请求与相应。每个Servlet都实现这些接口但是用户只需要实现一部分
代理模式
特点
跨模块调用跨进程调用远程web调用本地应用与远程web服务
实现方式
1、静态代理
在代理类构造中真实类最后由调用代理类的同名方法实现真实类的功能 2、动态代理
代理对象不需要接口利用JDK的API动态构建代理对象 使用经验
当不能直接访问目标对象可以访问该目标的代理对象目标对象实现的同时还可以在代理类扩展目标对象的功能静态代理中动态代理只有代理类不同用“ by 目标对象”自动加载代理过程形式参数小括号里的不能直接用必须先用变量接受保存起来调用变量使用形式参数前加val或var为成员变量可以在类里直接调用接口可以含参不可以有方法体
观察者模式
特点
定义对象之间一对多的依赖关系目标发生变化所有依赖它的对象都会得到通知并自动更新
实现方式
可以手动添加多个观察者当观察对象调用某些方法会通知并更新所有观察者的信息
所有观察者以集合形式存储在对象类里 添加观察者 通知所有观察者数据更新 使用经验:
事件处理机制Java中Swing GUI框架基于此实现当用户与组件交互组件通知注册的监听器触发相应事件日志记录日志变化通知文件输出流控制台输出流用户界面设计用户与UI元素交互它们像注册的监听器发送事件通知出发相应事件多线程编程线程发生变化向其他线程通知实现线程间协作和同步