原型模式与创建者模型

来源:互联网 发布:申请淘宝信用借贷 编辑:程序博客网 时间:2024/05/16 13:42

原型模式就是利用克隆来实现对象的复制,它适用于这种情况:需要一个和已有的对象“长的很像”的对象。比较简单吧。

class A{String name;int age;boolean sex;//man true;female falseint grade;public A(){name = "zhangsan";age = 20;sex = true;grade = 3;}//getter and setterpublic A clone(){return new A();}}

使用clone():

public static void main(String[] args) {// TODO Auto-generated method stubA a = new A();A aa = a.clone();a.name = "lisi";}

有一个A对象a,如果需要一个和a只是名字不同的对象,则可以克隆一个a,然后改改名字就可以了。

可能,A类中的属性也是引用类型的,而且其属性还持有别的引用,如此递归下去。这种情况下使用以上方法就不可行了。在java中提供了序列化机制,只要是实现了Serializable接口的类都可以被序列化,这样我们就可以重写出更好用的clone()了。如:

class Test implements Serializable{B b = new B();public Object deepClone()throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);Test2 test = (Test2)ois.readObject();return test;}}class B implements Serializable{}

如此一来,只要调用deepClone()就可以创建出全新的一个对象了。要注意的是,如果要序列化的某个类中有引用类型没有实现Serializable接口,程序就会抛出异常了。


以上就是原型模式,接下来说说建造者模式。

建造者模式也不常见,也就不细说了。直接上代码吧

class Product{String part1;String part2;String part3;String part4;}class Derector{AbstractBuilder a;public Derector(){}public Derector(AbstractBuilder a){this.a = a;}public Product construct(){a.buildPart1();a.buildPart2();a.buildPart3();a.buildPart4();return a.getResult();}}abstract class AbstractBuilder{protected Product product = new Product();abstract void buildPart1();abstract void buildPart2();abstract void buildPart3();abstract void buildPart4();public Product getResult(){return product;}}class Builder1 extends AbstractBuilder{@Overridepublic void buildPart1() {// TODO Auto-generated method stubproduct.part1 = "以方式一创建 part 1";}@Overridepublic void buildPart2() {// TODO Auto-generated method stubproduct.part2 = "以方式一创建 part 2";}@Overridepublic void buildPart3() {// TODO Auto-generated method stubproduct.part3 = "以方式一创建 part 3";}@Overridepublic void buildPart4() {// TODO Auto-generated method stubproduct.part4 = "以方式一创建 part 4";}}class Builder2 extends AbstractBuilder{@Overridepublic void buildPart1() {// TODO Auto-generated method stubproduct.part1 = "以方式二创建 part 1";}@Overridepublic void buildPart2() {// TODO Auto-generated method stubproduct.part2 = "以方式二创建 part 2";}@Overridepublic void buildPart3() {// TODO Auto-generated method stubproduct.part3 = "以方式二创建 part 3";}@Overridepublic void buildPart4() {// TODO Auto-generated method stubproduct.part4 = "以方式二创建 part 4";}}

代码比较长,但挺简单。不说了。

到此为止,已经学习了五个设计模式,这五个被归为一类:创建型设计模式。学完了这五个设计模式,可以明显的发现,要让系统具有较好的可扩展性,就要面向抽象编程,只有这样,才能“以不变应万变”,越是抽象的东西适用范围越广啊,真是没错呢。

接下来就是结构性设计模式了。

0 0
原创粉丝点击