创建型模式

1.简单工厂模式(静态工厂方法模式)

2.工厂方法模式

3.抽象工厂模式

4.建造者模式

5.单例模式

6.原型模式

1.简单工厂模式(静态工厂方法模式)

  • 作用:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
  • 应用场景:Java加解密

    • (解密)获取不同加密算法的密钥生成器:

      KeyGenerator keyGen=KeyGenerator.getInstance("AES");
      
    • (加密)创建密码器:

      Cipher cp=Cipher.getInstance("AES","BC");
      

2.工厂方法模式

  • 作用:当需要加入新产品时,对原有产品无需改动,只需要新增一个抽象工厂和具体产品就可以了。
  • 主要角色:
    • 抽象工厂(Abstract Factory)
    • 具体工厂(ConcreteFactory)
    • 抽象产品(Product)
    • 具体产品(ConcreteProduct)
  • 应用场景:JDBC中的工厂方法

    • 比如加载不同厂商的数据库驱动

      	Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=DB;user=;password=");
      	Statement statement=conn.createStatement();
      	ResultSet rs=statement.executeQuery("select * from UserInfo");
      

3.抽象工厂模式

4.建造者模式

  • 作用:将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变,但每一部分是可以灵活选择。
  • 优点
    • 封装性好,构建和表示分离。
    • 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
    • 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
  • 主要角色
    • Builder:抽象建造者
    • Concrete Builder:具体建造者
    • Director:指挥者
    • Product:产品角色
  • 应用场景StringBuilder.append源码

    public StringBuilder append(boolean b) {
        super.append(b);
        return this;
    }
        
    public StringBuilder append(char c) {
        super.append(c);
        return this;
    }
    ......
    

5.单例模式

  • 作用:单例模式(Singleton Pattern)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
  • 实现:

    • 懒汉式:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。

      public class LazySingleton
      {
      //保证 instance 在所有线程中同步
      private static volatile LazySingleton instance=null;   
      //private 避免类在外部被实例化 
      private LazySingleton(){}    
      public static synchronized LazySingleton getInstance()
      {
          //getInstance 方法前加同步
          if(instance==null)
          {
              instance=new LazySingleton();
          }
          return instance;
      }
      }
      
    • 饿汉式:类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在。

      public class HungrySingleton
      {
      private static final HungrySingleton instance=new HungrySingleton();
      private HungrySingleton(){}
      public static HungrySingleton getInstance()
      {
          return instance;
      }
      }
      
  • 应用场景: 在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例) Spring bean 默认是单例模式,scope=“singleton”。

6.原型模式

  • 作用:原型(Prototype)模式是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用原型模式除了可以生成相同的对象,还可以生成相似的对象
  • 实现:Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆。 原型模式的克隆分为浅克隆和深克隆。
    • 浅克隆:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。
    • 深克隆:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。
  • 使用:

    class Realizetype implements Cloneable
    {
        Realizetype(){}
        public Object clone() throws CloneNotSupportedException
        {
            System.out.println("具体原型复制成功!");
            return (Realizetype)super.clone();
        }
    }
    //具体使用
    Realizetype obj1=new Realizetype();
    Realizetype obj2=(Realizetype)obj1.clone();
    obj2.set属性(xxx);
    //通过obj2.set属性(xxx)可以修改属性,生成相似的对象。
    
  • 深拷贝的实现

    • 实现1:让每个引用类型属性内部都重写clone() 方法。
      • 缺点:存在一个引用类型,那么我们也要重写其clone 方法,这样下去,有多少个引用类型,我们就要重写多少次,如果存在很多引用类型,那么代码量显然会很大,所以这种方法不太合适
    • 实现2:利用序列化(实现 Serializable 接口)。
      • 优点:序列化产生的是两个完全独立的对象,所有无论嵌套多少个引用类型,序列化都是能实现深拷贝的。
      • 原理:序列化是将对象写到流中便于传输,而反序列化则是把对象从流中读取出来。这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。