原型模式:用原型對象指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。其實原型對象就是從一個對象再創(chuàng)建另外一個可定制的對象,而且無需知道任何創(chuàng)建的細節(jié)。
大致組成如下:
抽象的原型對象
通常是一個實現(xiàn)類了能克隆自身的抽象類或者接口。
具體原型對象
實現(xiàn)一個克隆自身的操作的對象
具體實現(xiàn)如下:
抽象原型對象
package prototype;
/**
* Created by canon on 2018/11/26.
*/
public abstract class Prototype implements Cloneable{
? ?public Prototype clone()
? ?{
? ? ? ?Prototype prototype = null;
? ? ? ?try
? ? ? ?{
? ? ? ? ? ?prototype = (Prototype)super.clone();
? ? ? ?}
? ? ? ?catch (CloneNotSupportedException e)
? ? ? ?{
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?return prototype;
? ?}
? ?public abstract void display();
}
具體原型對象
package prototype;
/**
* Created by canon on 2018/11/26.
*/
public class ConcretePrototype extends Prototype {
? ?@Override
? ?public void display() {
? ? ? ?System.out.println("原型模式之復(fù)制");
? ?}
}
客戶端調(diào)用
package controller;
import prototype.ConcretePrototype;
import prototype.Prototype;
/**
* Created by canon on 2018/11/26.
*/
public class PrototypeDesignPattern {
? ?public static void main(String[] args) {
? ? ? ?ConcretePrototype concretePrototype = new ConcretePrototype();
? ? ? ?Prototype prototypeA = concretePrototype.clone();
? ? ? ?prototypeA.display();
? ? ? ?Prototype prototypeB = concretePrototype.clone();
? ? ? ?prototypeB.display();
? ?}
}
客戶端輸出
原型模式之復(fù)制
原型模式之復(fù)制
Process finished with exit code 0
以上就是具體的實現(xiàn),當(dāng)然這僅僅只是簡單的淺復(fù)制的克隆,對于值引用的復(fù)制沒有任何問題,但是對于引用對象的復(fù)制會出現(xiàn)問題,具體解決方法可以通過深度克隆的方式去解決。原型模式用于創(chuàng)建重復(fù)的對象,同時又能保證性能。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的很好的方式。
優(yōu)點: 1、性能提高。 2、逃避構(gòu)造函數(shù)的約束。
缺點: 1、配備克隆方法需要對類的功能進行通盤考慮,這對于全新的類不是很難,但對于已有的類不一定很容易,特別當(dāng)一個類引用不支持串行化的間接對象,或者引用含有循環(huán)結(jié)構(gòu)的時候。 2、必須實現(xiàn) Cloneable 接口。
使用場景: 1、資源優(yōu)化場景。 2、類初始化需要消化非常多的資源,這個資源包括數(shù)據(jù)、硬件資源等。 3、性能和安全要求的場景。 4、通過 new 產(chǎn)生一個對象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限,則可以使用原型模式。 5、一個對象多個修改者的場景。 6、一個對象需要提供給其他對象訪問,而且各個調(diào)用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調(diào)用者使用。 7、在實際項目中,原型模式很少單獨出現(xiàn),一般是和工廠方法模式一起出現(xiàn),通過 clone 的方法創(chuàng)建一個對象,然后由工廠方法提供給調(diào)用者。原型模式已經(jīng)與 Java 融為渾然一體,大家可以隨手拿來使用。