码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之原型模式,构建者模式

时间:2020-08-20 18:33:00      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:nts   stat   原型   tst   block   就是   obj   一个   tor   

5. 原型模式(面试)

介绍

原型模式虽然是创建型的模式, 但是与工厂模式没有关系, 从名字既可看出, 该模式的思想就是将一个对象作为原型, 对其进行复制, 克隆, 产生一个和原对象类似的新对象

示例

  • 先创建一个原型类
 public class Prototype implements Cloneable {
     public Object clone() throws CloneNotSupportedException {
         Prototype proto = (Prototype) super.clone();
         return proto;
    }
 }

很简单, 一个原型类, 只需要实现Cloneable接口, 复写clone方法, 此处clone方法可以改成任意的名称, 因为Cloneable接口是一个空接口, 你可以任意定义实现类的方法名, 如cloneA或者cloneB, 因为此处的重点是super.clone()这句话, super.clone()调用的Object的clone()方法, 而在Object类中, clone()是native的, 具体怎么实现, 此处不再深究

在这里, 我将结合对象的浅复制和深复制说一下, 首先需要了解对象深浅复制的概念:

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

  • 深复制:将一个对象复制后, 不论是基本数据类型还是引用类型, 都是重新创建的, 简单来说, 就是深复制进行了完全彻底的复制, 而浅复制不彻底
  • 写一个深浅复制的例子
 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(bos.toByteArray());
         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 setObject(SerializableObject obj) {
         this.obj = obj;
    }

 }

 class SerializableObject implements Serializable {
     private static final long serialVersionUID = 1L;

 }

6. 构建者模式


介绍

建造者模式的定义是:将一个复杂的对象的构造与它的表示分离, 使同样的构建过程可以创建不同的表示, 这样的设计模式被称为建造者模式。

建造者模式的角色定义, 在建造者模式中存在以下4个角色:

  1. builder: 为创建一个产品对象的各个部件指定抽象接口

  2. ConcreteBuilder: 实现Builder的接口以构造和装配该产品的各个部件, 定义并明确它所创建的表示, 并提供一个检索产品的接口。

  3. Director: 构造一个使用Builder接口的对象

  4. Product: 表示被构造的复杂对象, ConcreteBuilder创建该产品的内部表示并定义它的转配过程, 包含定义组成部件的类, 包括将这些部件装配成最终产品的接口

工厂模式和构建模式的区别

构建者模式和工厂模式很类似, 区别在于构建者模式是一种个性产品的创建, 而工厂模式是一种标准化的产品创建

  • 导演类:按照一定的顺序或者一定的需求去组装一个产品

  • 构造者类:提供对产品的不同个性化定制, 最终创建出产品

  • 产品类:最终的产品

示例

  • 构建者
 // 构建者
 public class StudentBuilder {
     // 需要的构建对象
     private Student student = new Student();

     public StudentBuilder id(int id) {
         student.setId(id);
         return this;
    }
     public StudentBuilder name(String name) {
         student.setName(name);
         return this;
    }
     public StudentBuilder age(int age) {
         student.setAge(age);
         return age;
    }
     public StudentBuilder father(String fatherName) {
         Father father = new Father();
         father.setName(fatherName);
         student.setFather(father);
         return this;
    }
     // 构建对象
     public Student build() {
         return student;
    }

 }
  • 导演类
 // 导演类/ 测试类
 public class BuildDemo {
     public static void main(String[] args) {
         StudentBuilder builder = new StudentBuilder();
         // 如何创建一个Student
         Student student = builder.age(1).name("zhangsan").father("zhaosi").build();
         System.out.println(student);
    }
 }

故事凌
明天能否加个鸡腿!
喜欢作者

设计模式之原型模式,构建者模式

标签:nts   stat   原型   tst   block   就是   obj   一个   tor   

原文地址:https://blog.51cto.com/14901322/2521138

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!