GOF设计模式——Prototype模式

一、什么是Prototype模式?

在编程中,我们可以使用new关键字指定类名来生成类的实例,但是有时候也会有不指定类名的前提下生成实例。因为有时候对象种类繁多,无法将它们整合到一个类中;或者,生成实例的过程过于复杂,难以根据类生成实例;又或者,想要将类与框架解耦。这时,为了能够在不使用类名的情况下生成实例,可以使用Prototype模式,Prototype模式又叫原型模式,专门做一些“复制”的操作。

二、Prototype模式思想

Client负责调用Prototype接口生成实例,具体的实例生成的过程交给ConcretePrototype实现类,那么在Client调用Prototype这整个过程中都没有涉及ConcretePrototype类名。

三、具体实例

假设现在要做一个功能,将字符串放入方框中显示,或者加上下划线等操作。

1、Manager类

package com.cjs.Prototype;

import java.util.HashMap;

public class Manager {
    private HashMap showCase = new HashMap();
    public void register(String name, Product proto) {
        showCase.put(name, proto);
    }

    public Product create(String protoName) {
        Product product = (Product) showCase.get(protoName);
        return product.createClone();
    }
}

Manager类定义了两个方法,一个用于注册类,另一个是根据关键信息创建实例。

2、Product类

package com.cjs.Prototype;

public abstract class Product implements Cloneable {
    public abstract void use(String s);

    public final Product createClone() {
        Product product = null;

        try {
            product = (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return product;
    }
}

Product类定义了一个抽象方法use,用于让子类实现时拥有个性的行为;还有一个被final修饰的createClone方法,用于复制类,生成实例,这里用到了Template Method模式。

3、UnderlinePen类

package com.cjs.Prototype;

public class UnderlinePen extends Product {
    private char ulchar;

    public UnderlinePen(char ulchar) {
        this.ulchar = ulchar;
    }

    @Override
    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("");
    }
}

4、MessageBox类

package com.cjs.Prototype;

public class MessageBox extends Product {
    private char decochar;

    public MessageBox(char decochar) {
        this.decochar = decochar;
    }

    @Override
    public void use(String s) {
        int length = s.getBytes().length;
        for (int i = 0; i < length + 4; i++) {
            System.out.print(decochar);
        }
        System.out.println("");
        System.out.println(decochar + " " + s + " " + decochar);
        for (int i = 0; i < length + 4; i++) {
            System.out.print(decochar);
        }
        System.out.println();
    }
}

5、Main类

package com.cjs.Prototype;

public class Main {
    public static void main(String[] args) {
        Manager manager = new Manager();
        UnderlinePen underlinePen = new UnderlinePen(‘~‘);
        System.out.println("main underlinePen‘s hashCode = " + underlinePen.hashCode());
        MessageBox messageBox1 = new MessageBox(‘*‘);
        System.out.println("main messageBox1‘s hashCode = " + messageBox1.hashCode());
        MessageBox messageBox2 = new MessageBox(‘/‘);
        System.out.println("main messageBox2‘s hashCode = " + messageBox1.hashCode());
        manager.register("strong message", underlinePen);
        manager.register("warning box", messageBox1);
        manager.register("slash box", messageBox2);

        Product p1 = manager.create("strong message");
        System.out.println("Prototype p1‘s hashCode = " + p1.hashCode());
        Product p2 = manager.create("warning box");
        System.out.println("Prototype p2‘s hasCode = " + p2.hashCode());
        Product p3 = manager.create("slash box");
        System.out.println("Prototype p3‘s hasCode = " + p2.hashCode());

        p1.use("hello world");
        p2.use("hello world");
        p3.use("hello world");
    }
}

输出结果:

Main类里面对于每个生成的实例都打印出它们的hashCode,从Console窗口可以看出,即使是复制出来的实例,它们都不是同一个对象。在整个创建实例的过程中,除了一开始注册的时候用到了类名,其余的只用到了关键字,如“strong message”,“warning box”等,就可以创建对应的实例对象。

四、Prototype的作用

1、对象种类繁多,实现功能类似,使用Prototype模式可以便于源程序的管理,合理减少了类的数量;

2、在难以根据类生成实例的时候,有时候需要创建的类非常复杂,如果经常需要用到此类的对象,那么每次创建的时候会非常繁琐,相反,通过实例生成实例的方式会简单得多。

3、解耦

前面也提过很多次,一旦在某个类文件使用了一个类名来创建实例对象,那么这个类文件就跟使用的这个类具有高度的耦合性,特别是如果框架也这么做,那么这个框架就只适用某些类。

原文地址:https://www.cnblogs.com/SysoCjs/p/10327182.html

时间: 2024-11-06 11:53:52

GOF设计模式——Prototype模式的相关文章

GOF设计模式——Singleton模式

一.什么是Singleton模式? Singleton模式就是平常所说的单例模式,简单来说就只有一个实例.在使用java.lang.String的时候,将不同的字符串赋给String引用,其实就是创建了一个String对象实例,当有1000个不同的字符串创建的时候,就会出现1000个实例.有时候,我们只想在程序里面创建一个实例,譬如Hibernate的SessionFactory,那么我们可以使用Singleton模式来设计某一个类从始至终,程序调用的都是属于同一个实例. 二.Singleton

GOF设计模式——Builder模式

一.什么是Builder模式? builder模式,就好比一栋大楼,这栋大楼有很多个组件组成,但是这栋大楼只是一个各个组件结合起来的框架,每一栋大楼都有各自的特色,这些特色由它们实际情况决定.对于程序而言,这栋大楼就好比一个Builder抽象类,里面定义了很多组件方法,一个完整的功能离不开里面的每一个方法,具体实现依赖子类,只要继承这个抽象类,就可以根据组件方法组建起自己的"大楼". 二.Builder模式思想 Builder类:负责生成实例的接口,里面定义了用于生成实例的方法: Co

Gof 设计模式 、MVC 编程模式

主题: Gof 设计模式 .MVC 设计模式 名词解释: OOP  (面向对象程序设计) 接口 抽象类 Refactoring(重构方法) GoF(Gang of Four),中文名——四人组.GoF是一种设计模式. via http://baike.so.com/doc/176639.html Model–view–controller (MVC) via http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller 有力

深入浅出设计模式 ------ Prototype(原型模式)之深度克隆

继上篇深入浅出设计模式 ------ Prototype(原型模式)的浅克隆实现, 本文进入Prototype(原型模式)的进阶篇----深度克隆. 深度克隆 ---- 序列化方式实现 把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization).写在流里的是对象的一个克隆(新的, 独立的), 而原对象仍存在于JVM内存模型里.因此, 以下代码采用序列化方式实现深度克隆. 第一步: 将上篇的代码做些许改动, 加入对象引用

深入浅出设计模式 ------ Prototype(原型模式)

一. 定义  用原型实例指定创建对象的种类. 并且通过拷贝这些原型创建新的对象. 二. 结构  三. 参与者 Prototype : 克隆自身的接口(如代码实现中的FruitPrototype) PrototypeTool : 管理Prototype的工具类, 存储原型复制自身到数据接口(如FruitTool) ConcretePrototype : 实现一个克隆自身的操作(如ConcteteFruitPrototype) Client : 测试类 四. 适用性 -- 多用于创建复杂的或者耗时的

谈谈设计模式~原型模式(Prototype)

返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. 从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

GOF设计模式以外的经典模式

除了23种设计模式,还有许多常见的设计模式. 1.简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.

GoF设计模式三作者15年后再谈模式

Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85,000 iPhone的小应用遍布全球,使用PHP就能够写一个简单的"Hello, World! The time is X"Web网页,那么,面向对象设计是难的,这句话是否还正确呢? Richard Helm: 软件设计总是很难的,尽管大多数现代开发环境已经降低了复杂性,通过重用库和工具