创建型模式
创建型模式
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 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。
- 实现1:让每个引用类型属性内部都重写clone() 方法。