热门问题
时间线
聊天
视角
原型模式
来自维基百科,自由的百科全书
Remove ads
原型模式是創建型模式的一種[1]:117,其特點在於通過「複製」一個已經存在的實例來返回新的實例,而不是新建實例。被複製的實例就是我們所稱的「原型」,這個原型是可定製的。

原型模式多用於創建複雜的或者耗時的實例,因為這種情況下,複製一個已經存在的實例使程序運行更高效;或者創建值相等,只是命名不一樣的同類數據。
結構

在上面的UML類圖中,Client
類提及Prototype
接口來克隆一個Product
。Product1
類通過創建自身複本來實現Prototype
接口。
UML序列圖展示了運行時交互:Client
對象調用clone()
於prototype:Product1
對象之上,它創建並返回自身的一個複本(product:Product1
對象)。
示例
下面是Java例子:
/** Prototype Class **/
public class Cookie implements Cloneable {
public Object clone() throws CloneNotSupportedException {
//In an actual implementation of this pattern you would now attach references to
//the expensive to produce parts from the copies that are held inside the prototype.
return (Cookie) super.clone();
}
}
/** Concrete Prototypes to clone **/
public class CoconutCookie extends Cookie { }
/** Client Class**/
public class CookieMachine {
private Cookie cookie;//cookie必须是可复制的
public CookieMachine(Cookie cookie) {
this.cookie = cookie;
}
public Cookie makeCookie() {
try {
return (Cookie) cookie.clone();
}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public static void main(String args[]){
Cookie tempCookie = null;
Cookie prot = new CoconutCookie();
CookieMachine cm = new CookieMachine(prot); //设置原型
for(int i=0; i<100; i++)
tempCookie = cm.makeCookie();//通过复制原型返回多个cookie
}
}
下面是Python例子:
import copy
class Prototype():
def clone(self):
return copy.copy(self)
class Product(Prototype):
def __init__(self, number=0, **kwargs):
self.number = number
for key, value in kwargs.items():
self.__dict__[key] = value
class ProductCreator():
def __init__(self, proto):
self.proto = proto
self.number = proto.number
def __call__(self):
self.number += 1
r = self.proto.clone()
r.number = self.number
return r
product0 = Product()
product_creator = ProductCreator(product0)
products = [product0]
for i in range(1, 20):
products += [product_creator()]
Remove ads
參見
引用
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads