• 设计模式之创建型汇总


    设计模式


    创建型

    工厂方法模式

    定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行

    使用场景

    • 创建对象需要大量重复的代码

    • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

    • 一个类通过其子类来指定创建哪个对象

    • 当明确地计划不同条件下创建不同实例时

    优点

    • 用户只需关心所需产品对应的工厂,无须关心创建细节

    • 加入新产品符合开闭原则,提高可扩展性

    缺点

    • 类的个数容易过多,增加复杂度

    • 增加了系统的抽象性和理解难度

    注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

    源码用处

    • collection 类的 iterator

    抽象工厂模式

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,工厂的工厂

    使用场景

    • 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

    • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

    • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

    优点

    • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象

    • 具体产品在应用层代码隔离,无须关心细节

    • 将一个系列的产品族统一到一起创建

    缺点

    • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码

    • 增加了系统的抽象性和理解难度

    注意事项:产品族难扩展,产品等级易扩展。

    源码用处

    • jdk:java.sql.connection、java.sql.statement

    • mybatis:SqlSessionFactory

    建造者模式

    定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道

    使用场景

    • 如果一个对象有非常复杂的内部结构(很多属性),想把复杂对象的创建和使用分离。一些基本部件不会变,而其组合经常变化的时候。

    优点

    • 易扩展,建造者独立,一定程度的解耦

    • 封装性好,创建与使用相分离

    • 便于控制细节风险

    缺点

    • 产品必须有共同点,范围有限制

    • 如内部过于复杂,会有很多的建造类

    • 产品内部发生变化,建造者都要修改,成本较大

    注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序

    源码用处

    • StringBuilder

    • mybatis里面的SqlSessionFactoryBuilder

    单例模式

    定义:保证一个类仅有一个实例,并提供一个全局的访问点

    使用场景

    • 想确保任何情况下都绝对只有一个实例

    • 当你想控制实例数目,节省系统资源的时候

    优点

    • 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

    • 避免对资源的多重占用(比如写文件操作)

    • 设置全局访问点,严格控制访问

    缺点

    • 没有接口,不能继承

    • 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

    注意事项:私有构造器,线程安全,延迟加载,序列化和反序列化安全(需要在单例类里,添加readResolve()方法如:

    private Object readResolve(){
       return hungrySingleton;
    }

    ),反射Q(解决办法:在私有构造器里面,添加判断,抛出异常,如:

    private LazySingleton(){
       if(lazySingleton != null){
           throw new RuntimeException("单例模式禁止反射调用");
      }
    }

    源码用处

    • jdk1.8 的 Runtime类(饿汉式):private static Runtime currentRuntime = new Runtime();

    • jdk1.8 的 Desktop(容器式)

    • spring 中的 bean 的作用域 singleton

    原型模式

    定义:指定原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,不需要知道任何创建的细节,不调用构造函数

    使用场景

    • 类初始化消耗较多的资源

    • new产生的一个对象需要非常繁琐的过程(数据备份、访问权限等)

    • 构造函数比较复杂

    • 循环体中产生大量的对象时

    优点

    • 原型模式性能比直接new一个对象性能高

    • 简化创建过程

    缺点

    • 必须配备克隆方法

    • 对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险

    • 深拷贝、浅拷贝要运用得当

    注意事项

    • 深克隆,浅克隆

    • 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

     

  • 相关阅读:
    001_jdk配置
    mysql(5.7)安装教程
    mysql(5.6)安装教程
    外网发布
    蓝桥 历届试题 分考场
    蓝桥 历届试题 合根植物
    Codeforces Round #650 (Div. 3) D : Task On The Board
    HDU 3336 Count the string
    leetcode [238. 除自身以外数组的乘积]
    leetcode [837. 新21点]
  • 原文地址:https://www.cnblogs.com/horken/p/10778426.html
Copyright © 2020-2023  润新知