小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、单例模式
定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
理解: 单例模式就是对象只有一个唯一的实例,例如Windows系统的任务管理器。单例模式的实例对象只能由单例类自己创建,外部无法创建。单例类提供一个对外方法来获取实例对象。单例模式又分懒汉式单例和饿汉式单例。懒汉式单例就是我觉得你肯定用不到这个对象,等你什么时候需要使用我就什么时候在创建实例,实现延时加载,需要注意线程安全问题。饿汉式单例就是,我觉得你很需要用,我就再类加载时就创建实例对象,不管你后面到底用不用,由于类加载时创建的实例,所以线程安全。
优点: 单例模式保证只存在一个唯一实例,减少系统内存开销。避免对资源的多重利用。****
缺点: 没有接口,不方便扩展,扩展需要修改代码,违反开闭原则。与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
场景: 需要频繁创建的类,使用单例可以减少系统压力;只需要生成一个对象的时候,例如一个人只有一个身份证号等。创建的类占用资源较多、时间长或者需要频繁使用。****
二、原型模式
定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
理解: 原型模式是用利用原型实例通过拷贝创建一个新的实例,简单说就是复制一个实例对象。原型模式拷贝对象分为浅拷贝和深拷贝,浅拷贝当类的成员变量是基本数据类型时浅拷贝会复制该属性的值赋值给新对象。当成员变量是引用数据类型时,浅拷贝复制的是引用数据类型的地址值。深拷贝不仅会复制成员变量为基本数据类型的值,给新对象。还会给是引用数据类型的成员变量申请储存空间,并复制引用数据类型成员变量的对象。
优点: java的Object自带clone方法,比new高效。可以使用深拷贝保存对象状态,简化创建对象的过程,以便在有需要的时候使用。
缺点: 每个类都需要一个clone方法。clone方法在类的内部,当需要改造时需要修改代码,违反开闭原则。
场景: 创建对象成本较大,占用时间多的。频繁使用的,且需要给属性赋值的。创建一个对象需要繁琐的数据准备或访问权限等。
三、建造者模式
定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
理解: 有时候在开发过程中需要创建一个复杂对象,这个复杂对象通常由多个子部件组成,例如计算机由主板、cpu、内存、显卡、磁盘等组成,这些产品由多个部件组成,各部件可以灵活选择,但是创建的步骤又大同小异,建造者模式就可以很好的创建。建造者模式有4个角色,产品角色包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件;抽象建造者是个包含创建产品各子部件的抽象方法接口;具体建造者完成复杂产品的各个部件的具体创建方法;指挥者调用建造者对象中的部件构造与装配方法完成复杂对象的创建。建造者模式 跟工厂模式相比, 多了一个控制类, 用来控制对象的创建,同时建造者模式是关注的创建的过程,为了减少中间创建对象代码。
优点: 封装性好,构建和表示分离。扩展性好,各个具体的建造者相互独立,有利于系统的解耦。****
缺点: 产品的组成部分必须相同,限制了其使用范围。产品内部变化复杂,建造者也要修改,后期维护成本大。
场景: 相同的方法,不同的执行顺序,产生不同的结果。初始化一个对象复杂,参数多,都有默认值。产品类复杂,不同的调用顺序产生不同的结果。