设计模式之原型模式
原型模式指的是通过原型实例拷贝新的对象,其实就是通过对象自身复制自己的能力。
原型模式比较简单,它能够让对象具备复制自己的能力。一般原型模式会有一个抽象原型角色,若对象实例想具备复制自己的能力,需要继承该抽象原型角色。
原型模式UML类图
图1所示,原型模式的抽象接口有一个clone方法,所有需要具有复制自己能力的类需要实现该接口。
该类图中具体原型类有Film类和Music类,假如电影和音乐能够复制,就可以通过原始文件拷贝无数份了。
图1
代码实现
原型抽象接口-Prototype
/**
* <p>文件描述: 原型抽象接口</p>
*
* @Author luanmousheng
* @Date 17/7/5 下午11:00
*/
public interface Prototype {
/**
* 实现原型的抽象方法
* @return
*/
Object clone();
}
具体原型类-Film
/**
* <p>文件描述: 电影类,可以拷贝自己</p>
*
* @Author luanmousheng
* @Date 17/7/5 下午11:02
*/
public class Film implements Prototype {
//模拟电影具体内容
private String content;
public Film(String content) {
this.content = content;
}
@Override
public Object clone() {
return new Film(this.content);
}
public String getContent() {
return this.content;
}
}
具体原型类-Music
/**
* <p>文件描述: 音乐类,可以拷贝自己</p>
*
* @Author luanmousheng
* @Date 17/7/5 下午11:07
*/
public class Music implements Prototype {
//模拟音乐具体内容
private String content;
public Music(String content) {
this.content = content;
}
@Override
public Object clone() {
return new Music(this.content);
}
public String getContent() {
return this.content;
}
}
原型测试类-PrototypePatternDemo
/**
* <p>文件描述: 原型模式测试类</p>
*
* @Author luanmousheng
* @Date 17/7/5 下午11:09
*/
public class PrototypePatternDemo {
public static void main(String[] args) {
//电影"肖申克的救赎"的原件
Film shawshankRedemption = new Film("电影\"肖申克的救赎\"");
//电影"肖申克的救赎"的拷贝
Film copyOfShawshankRedemption = (Film) shawshankRedemption.clone();
System.out.println(copyOfShawshankRedemption.getContent());
//音乐"道歉"原件
Music apologize = new Music("歌曲\"道歉\"");
//音乐"道歉"的拷贝
Music copyOfApologize = (Music) apologize.clone();
System.out.println(copyOfApologize.getContent());
}
}
测试输出结果为:
电影"肖申克的救赎"
歌曲"道歉"
实际上,JDK已经提供了Clone接口,具体实现原型类的时候直接使用该接口即可,本文是为了更好的理解原型模式而定义了该接口。