zoukankan      html  css  js  c++  java
  • (@WhiteTaken)设计模式学习——原型模式

    有这样一个需求,两个对象,只是名称以及其他几个属性不一样,而其他的大部分的属性都是相同的。

    这时候我们可以用到原型模式,也就是克隆模式

    原型模式:原型模式是一个对象创建型模式,通过克隆原对象,可以使新对象的数据与原对象数据保持一致。

    原型模式是由原对象发起的,创建新对象的方法。

    原对象与新对象具备一样的数据结构以及一样的值。

    克隆模式有浅层克隆和深层克隆之分(主要体现在对引用对象的处理不同)

    直接上代码。

    1.创建一个书类,书有几个属性,名称,书页数,出版单位,作者等。

    2.实现克隆模式,java的话需要实现cloneable接口

    3.在类中实现克隆的方法,本例中有浅层克隆和深层克隆两种方法。区别在于对引用对象的处理。

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class Book implements Cloneable{  //原型模式需要实现cloneable接口
     5     private String name;
     6     private int number;
     7     private String company;
     8     private List<String> author;      //指向的是一个引用的空间
     9     public String getName() {
    10         return name;
    11     }
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15     public int getNumber() {
    16         return number;
    17     }
    18     public void setNumber(int number) {
    19         this.number = number;
    20     }
    21     public String getCompany() {
    22         return company;
    23     }
    24     public void setCompany(String company) {
    25         this.company = company;
    26     }
    27     
    28     public List<String> getAuthor() {
    29         return author;
    30     }
    31     public void setAuthor(List<String> author) {
    32         this.author = author;
    33     }
    34     
    35     //浅层克隆,clone以后引用会保持一致,当引用对象发生改变,两个克隆对象就会发生改变
    36     public Book ShallowClone(){
    37         try {
    38             return (Book) super.clone();
    39         } catch (CloneNotSupportedException e) {
    40             // TODO Auto-generated catch block
    41             e.printStackTrace();
    42             return null;
    43         }
    44     }
    45     //深度克隆,需要对有引用的地方进行操作
    46     public Book DepthClone(){
    47         try {
    48             Book book=(Book)super.clone();
    49             List<String> authors=new ArrayList<String>();
    50             for(String author:this.getAuthor()){
    51                 authors.add(author);
    52             }
    53             book.setAuthor(authors);
    54             return book;
    55         } catch (CloneNotSupportedException e) {
    56             // TODO Auto-generated catch block
    57             e.printStackTrace();
    58             return null;
    59         }    
    60     }
    61 }

    4.主客户端测试代码

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 //原型模式也叫克隆模式
     5 public class MainClass {
     6     public static void main(String[] args) {
     7         Book book1=new Book();                  //实例化一个book1
     8         book1.setName("shujujiegou");
     9         book1.setNumber(100);
    10         book1.setCompany("TomCompany");
    11         List<String>author=new ArrayList<>();
    12         author.add("Tom");
    13         author.add("WhiteTaken");
    14         book1.setAuthor(author);
    15         
    16         Book book2=book1.ShallowClone();        //实例化一个book2,调用book1的浅层克隆方法
    17         book1.setName("数据结构");            //浅层克隆,引用指向同一个,但是String等类型的值直接克隆
    18         author.add("Langer");              //修改book1的值,浅层克隆book1和book2指向的是同一个引用,打印的值相同
    19     
    20         System.out.println(book1.getName());
    21         System.out.println(book1.getNumber());
    22         System.out.println(book1.getCompany());    
    23         System.out.println(book1.getAuthor());
    24         
    25         System.out.println(book2.getName());
    26         System.out.println(book2.getNumber());
    27         System.out.println(book2.getCompany());
    28         System.out.println(book2.getAuthor());
    29         
    30         System.out.println("==================");
    31         
    32         Book book3=book1.DepthClone();          //实例化一个book3,调用book1的深层克隆方法
    33         author.add("KZMASTER");              //修改book1的引用值,book3没有变化
    34         System.out.println(book1.getAuthor());
    35         System.out.println(book3.getAuthor());
    36     }
    37 }

    应用场景:在某些情况下,被创建的对象,不仅仅想拥有其基类的数据结构,也想继承其基类的数据,这时候可以考虑原型模式。

    深度克隆,可以保证原对象和克隆出来的新对象,完全互不影响

    克隆的方法是在对象类中实现的。

  • 相关阅读:
    jquery中 append 和appendto的区别
    vb的property 和event
    VB 基础语法以及教学视频
    outlook 2007 IMAP设置和配置
    浏览器文档播放Shockwave Flash 插件问题
    VB execl文件后台代码,基础语法
    VB中后台打开Excel文件实现代码
    excel文件后台代码
    DataTable中执行DataTable.Select("条件"),
    多个不同的表合并到一个datatable中,repeater在绑定datatable
  • 原文地址:https://www.cnblogs.com/WhiteTaken/p/6408028.html
Copyright © 2011-2022 走看看