^_^*******模式初学者请进,简单而经典模式:prototype*******^_^up有分!

Arhero 2004-11-04 04:23:17
加精
我对prototype有一些不太清楚的地方,请大家讨论指正:由于该模式是复制本身,如果是这样的话,于是,我就有一大胆的猜想,是不是java中实现了clone方法的,都是运用了prototype模式?
...全文
248 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wandou999 2004-11-08
  • 打赏
  • 举报
回复
uuuuuuuuuup
gong1 2004-11-07
  • 打赏
  • 举报
回复
同意高手们的说法。
^_^。
学习设计模式。^_^
Arhero 2004-11-05
  • 打赏
  • 举报
回复
to:jeffyan77(jeffyan77)
高手风范,非常详细的解说。为优美的文字,致敬:〉
snow_oracle 2004-11-05
  • 打赏
  • 举报
回复
studying
lsqlister001 2004-11-05
  • 打赏
  • 举报
回复
学习中
weimenren 2004-11-05
  • 打赏
  • 举报
回复
/*
* A MyGraphics Interface ( A prototype interface )
* 定义一个接口,即原型实例,用MyGraphics定义创建对象的种类
* 这里定义了接口实现Cloneable,方便以后使用的时间可以通过Clone来创建新的对象
*/
import java.io.*;

public interface MyGraphics extends Cloneable, Serializable {
public String getName() ;
public void setName(String gName);
public Object clone();
public void doSomething();
}

/*
* An Abstract MyGraphicImpl Class ( Prototype )
* 这个类主要实现接口中的Clone() 方法
*
*/
import java.lang.*;
import java.io.*;

public abstract class MyGraphicsImpl implements MyGraphics {
private String name;

public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e){
System.out.println("Do not support clone !!!");
throw new InternalError();
}
}

public String getName() {
return name;
}

public void setName(String gName) {
name = gName;
}

public abstract void doSomething();
}

/*
* A concrete prototype to draw a line
* 一个具体的实例,做子类需要做的事情
*/
public class LineSymbol extends MyGraphicsImpl {
public LineSymbol() {
}

public void doSomething() {
System.out.println("I am used to draw a line !");
}
}

/*
* A concrete prototype to draw a note
* 另外一个具体的实例,做它需要做的事情
*/
public class NoteSymbol extends MyGraphicsImpl {
public NoteSymbol() {
}

public void doSomething() {
System.out.println("I am used to draw a note !");
}
}

/*
* A Symbol Loader to register all prototype instance
* 定义一个装载类,以注册所有的原型实例
*/
import java.util.*;

public class SymbolLoader {
private Hashtable symbols = new Hashtable();
public SymbolLoader() {
symbols.put("Line", new LineSymbol());
symbols.put("Note", new NoteSymbol());
}
public Hashtable getSymbols() {
return symbols;
}
}

/*
* As a Test Client to test our pattern
* 测试类,测试我们的结果,通过Clone创建子类的实例
*/
import java.util.*;
import java.lang.*;

public class GraphicTool {
public GraphicTool() {
}

public static void main(String[] args) {
//初始化我们的原型实例
SymbolLoader myLoader = new SymbolLoader();
Hashtable mySymbols = myLoader.getSymbols();

for(int i = 0; i < 10; i++) {
// 画一条线,通过clone的方法创建一个子类的实例
MyGraphics myLine =
(MyGraphics)((MyGraphics)mySymbols.get("Line")).clone();
// 判断所有创建的子类是不同的对象
System.out.println("myLine.hashCode = " + myLine.hashCode());
// 子类做它自己的事情
myLine.doSomething();
// 下面是另外一个子类做它自己的事情
MyGraphics myNote =
(MyGraphics)((MyGraphics)mySymbols.get("Note")).clone();
System.out.println("myCode.hashCode = " + myNote.hashCode());
myNote.doSomething();
}

}
}

在上面的例子中

我们做到了

意图:

指定原型实例的种类,而后通过拷贝创建这个原型实例

解决方案:

创建一个祖先类,这个祖先类里我们定义了clone的方法(MyGraphics)
通过继承祖先类创建指定的产品,并且在指定的产品中我们实现了clone方法,以方便创建一个它自己的拷贝(MyGraphicsImpl)
在系统的初始化中,我们为每一个指定的产品创建了每一个原型实例(SymbolLoader)
在需要创建一个指定的实例的任何时间,使用clone的方法创建原型实例(GraphicTool)

在以上的例子中,我们定义了一个接口,定义所有这种种类的可以操作的方法,并且实现了Cloneable,以方便子类通过clone自己来创建对象。而后我们在一个子类中实现了clone()的方法,再下来我们在具体的子类中定义了他们自己需要做的事情。 最后我们把所有子类的实例装载到一个Hashtable中,以方便以后知道子类的种类,就可以找到我们拷贝的原型,而后通过拷贝这些原型,我们得到了我们需要的大量的子类的实例。

weimenren 2004-11-05
  • 打赏
  • 举报
回复
Prototype 模式本质上来讲就是clone一个对象,而clone的程度取决于你对clone的实现。

Prototype 模式的好处:

工厂模式用于创建新的对象是非常好的,但是一旦你有一个对象它的状态不能通过外部初始化来确定。你没有把对象的状态值定义为public,工厂对象没有权限去访问对象的状态信息。并且它没有机会去修改它的状态。

这个时间就要用到Prototype了,Prototype复制它自己,它有足够的权利访问他自己内部的状态,并且所有的复制的对象有相同的类型,所以可以为新的对象定义所有的状态参数
jeffyan77 2004-11-04
  • 打赏
  • 举报
回复
java中实现了clone方法的,都是运用了prototype模式。这是正确的。
showerXP 2004-11-04
  • 打赏
  • 举报
回复
我赞同。可能我错了。
Arhero 2004-11-04
  • 打赏
  • 举报
回复
模式的确是可以变化,我之所以要往上靠的原因是,我知道它是什么,有什么用才能在日后加以利用。仅此而已了。不过,你的提法很有意义。
bluesage 2004-11-04
  • 打赏
  • 举报
回复
我觉得这个提法意义不大
应该是java中用clone方法来实现prototype。
prototype的意思是用原型CLONE出新对象,不必创建新对象。
不必刻意往模式上联系,而且模式也可以变化。
FGhost33 2004-11-04
  • 打赏
  • 举报
回复
也在学设计模式
FGhost33 2004-11-04
  • 打赏
  • 举报
回复
up

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧