创建模式之Prototype(原型)

news/2024/7/4 0:56:58 标签: prototype, manager, string, interface, class, object
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 

class="postbody">

复制产生对象实例:
使用Prototype模式可以理解为  创造出一个和已有对象一样的对象
ex)指着面包店橱窗里的面包告诉老板 我就要这个 虽然不知道名字 也不知道做法 但是能买到和所指的相同的东西。
实例:
1、定义一个接口 实现Cloneable
public class="tags" href="/tags/INTERFACE.html" title=interface>interface Product extends Cloneable {
    public abstract void use(String s);
    public abstract Product createClone();
}
2、声明一个manage类来根据Product的createClone来进行复制
public class Manager {
       private Hashtable showcase = new Hashtable();
    public void register(String name, Product proto) {
        showcase.put(name, proto);
    }
    public Product create(String protoname) {
        Product p = (Product)showcase.get(protoname);
        return p.createClone();
    }
}
3、Product类的一个具体实现
public class UnderlinePen implements Product {
    private char ulchar;
    public UnderlinePen(char ulchar) {
        this.ulchar = ulchar;
    }
    public void use(String s) {
        int length = s.getBytes().length;
        System.out.println("/""  + s + "/"");
        System.out.print(" ");
        for (int i = 0; i < length; i++) {
            System.out.print(ulchar);
        }
        System.out.println("");
    }
    public Product createClone() {
        Product p = null;
        try {
            p = (Product)clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return p;
    }
}
4、具体使用
     // 预备阶段
        Manager class="tags" href="/tags/MANAGER.html" title=manager>manager = new Manager();
        UnderlinePen upen = new UnderlinePen('~');
        MessageBox mbox = new MessageBox('*');
        MessageBox sbox = new MessageBox('/');
        class="tags" href="/tags/MANAGER.html" title=manager>manager.register("strong message", upen);
        class="tags" href="/tags/MANAGER.html" title=manager>manager.register("warning box", mbox);
        class="tags" href="/tags/MANAGER.html" title=manager>manager.register("slash box", sbox);

        // 实现产生
        Product p1 = class="tags" href="/tags/MANAGER.html" title=manager>manager.create("strong message");
        p1.use("Hello, world.");
        Product p2 = class="tags" href="/tags/MANAGER.html" title=manager>manager.create("warning box");
        p2.use("Hello, world.");
        Product p3 = class="tags" href="/tags/MANAGER.html" title=manager>manager.create("slash box");
        p3.use("Hello, world.");
    }

也可以将product声明成抽象类实现Cloneable接口
并且实现createClone方法
这样子类中就不用再声明creatClone方法了 简化了代码

clone方法在Object中定义 因此所有类都会继承clone()方法
Cloneable这个接口表示 可用clone()方法进行复制
clone()方法做的是浅拷贝 所做的操作是直接复制字段内容 并不管该字段对应的对象实例内容 假定有一个数组 当使用clone方法进行拷贝以后 复制的结果,只是对应到该数组的参照 即指向该数组的内存地址 如果想做深拷贝 必须重写clone方法 记得要加上super.clone()


http://www.niftyadmin.cn/n/1051962.html

相关文章

java类加载器学习2——自定义类加载器和父类委托机制带来的问题

一、自定义类加载器的一般步骤 Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制。一个类需要被加载的时候&#xff0c;JVM先会调用他的父类加载器进行加载&#xff0c;父类调用父类的父类&#xff0c;一直到顶级类加载器。如果父类加载器加载不了&#xff0c;依…

创建对象之Factory (工厂)

Factory有两种理解方式&#xff0c;个人感觉不太一样&#xff0c;不知道哪种理解方式比较正确1、引入Factory Pattern的目的是为了封装类的实例化操作 public class Factory{ public static Sample creator(int which){ //getClass 产生Sample 一般可使用动态类装载装…

learning java AWT 布局管理器 GridBagLayout

在GridBagLayout布局管理器中&#xff0c;一个组件可以跨越一个或多个网格&#xff0c;并可以设置各网格的大小互不相关。 import java.awt.*;public class GridBagTest {private Frame f new Frame("测试窗口");private GridBagLayout gb new GridBagLayout();pr…

struts的html:radio之一默认为选中状态

由于<html:radio/>没有checked/selected属性&#xff0c;所以我们可以使用javascript来完成这个功能。 当页面下面加上&#xff1a; <script> document.all("sex")[0].checkedtrue; //第一个radio选中 </script>注&#xff1a;如…

LMC7660即-5V产生电路

LMC7660为小功率极性反转电源转换器&#xff0c;通过LMC7660电路产生&#xff0d;5V电压&#xff0c;其芯片管脚定义如下表所示&#xff0e; LMC7660负电压产生电路如下图所示&#xff0e; 其中6脚当供电电压大于等于5V时该脚必须悬空&#xff0c;当供电电压小于3.5V时该脚接地…

力扣——第N个泰波那契数

泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a;输入&#xff1a;n 4输出&#xff1a;4解释&#xff1a;T_3 0 1 1 2T_4 1 1 2 4示…

html:radio 之二--选中问题

public void reset(ActionMapping mapping, HttpServletRequest request) { String id request.getParameter("id"); ComJob job new ComJob(); ComJobDAO jobdao new ComJobDAO(); if (idnull||id""){ this.setComputer("一般");…

Tengine

Tengine是主要用于处理静态资源的web服务器。 web应用服务器&#xff0c;是用来处理动态请求&#xff0c;常见的以tomcat、jetty等servlet容器为代表。可以用来部署应用。 web服务器&#xff0c;只能处理静态资源请求。 如果要处理动态请求&#xff0c;需要通过其动态代理功能实…