Java 设计模式 - 建造者模式 - 原型模式

2016/11/10 Java

Java 设计模式 - 建造者模式 - 原型模式

内容

建造者模式(Builder)

  • 建造者模式是将各种产品集中起来进行管理,用来创建复合对象
  • 复合对象就是指某个类具有不同的属性,就是前面抽象工厂模式与测试类相结合。

例子 - 建造者模式


     public  class Builder{
          private List<Sender> list = new ArrayList<Sender>();

          public void produceMailSender(int count){
            for(int i=0;i<count;i++){
              list.add(new MailSender());
            }
          }
          public void produceSmsSender(int count){
            for(int i=0;i<count;i++){
              list.add(new SmsSender());
            }
          }
     }
  • Test class

     public class Test{
        public static void main(String[] args){
          Builder builder = new Builder();
          builder.produceMailSender(10);
        }
     }

建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。

原型模式(Prototype)

  • 原型模式是创建型模式,但是与工程模式没有关系。
  • 该模式的思想就是讲一个对象作为原型,对其进行复制,克隆,产生一个和原对象类似的新对象。

例子 - 原型模式


     public class Prototype implements Cloneable{

        public Object clone() throws CloneNotSupportedException{
          Prototype proto = (Prototype)super.clone();
          return proto;
        }
     }

一个原型类,只要实现Cloneable接口,覆写clone()方法

  • 深复制 : 将一个对象复制后,不论是基本数据类型还是引用类型,都是重新创建的。
  • 浅复制 : 讲一个对象复制后,基本数据类型的变量都会重新创建,引用类型指向的还是原对象所指向的

例子 - 深浅复制

  
     public class Prototype implements Cloneable,Serializable {
        private static final long serialVersionUID = 1L;
        private String string;
        private SerializableObject obj;

        //浅复制
        public Object clone() throws CloneNotSupportedException {
            Prototype proto = (Prototype)super.clone();
            return proto;
        }

        //深复制
        public Object deepClone() throws IOException,ClassNotFoundException{
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            ByteArrayInputStream bis = new ByteArrayInputStream();
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        }

        public String getString(){
          return string;
        }
        public void setString(String string){
          this.string = string;
        }

        public SerializableObject getObj(){
          return obj;
        }
        public void setObj(SerializableObject obj){
          this.obj = obj;
        }
     }

     class SerializableObject implements Serializable{
        private static final long serialVersionUID = 1L;
     }
  • 深复制,需要采用流的方式读入当前对象的二进制输入,再写出二进制数据对应的对象。
Show Disqus Comments

Search

    Post Directory