创建型设计模式(四)原型模式

一、一句话背景

假如我是个设计大佬,我经常需要调用服务去获取各种基本图形来组合我的素材,那重复访问的工作就会很多,那在没有外置缓存的情况下,可以考虑使用原型模式来玩~

二、使用场景

需要重复生成多次相同对象的场景。

如:重复取相同对象使用时

三、模型分析

图形原型:抽象类,原型父类,用于扩展子类对象,并进行复用

具体图形:类,图形父类的多样化拓展

模拟缓存:类,用于模拟缓存具体的对象,并提供复制方法

四、代码分析

图形原型

/**
 * 形状类,原型父类,用于扩展子类对象,并进行复用
 */
public abstract class Shape implements Cloneable {

    private String id;
    protected String type;

    public abstract void draw();

    public String getType() {
        return type;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

具体图形

/**
 * 圆形类
 */
public class Circle extends Shape {

    public Circle() {
        type = "Circle";
    }

    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}
/**
 * 矩形类
 */
public class Rectangle extends Shape {

    public Rectangle(){
        type = "Rectangle";
    }

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}
/**
 * 正方形类
 */
public class Square extends Shape {

    public Square() {
        type = "Square";
    }

    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

模拟缓存

/**
 * 模拟缓存类,用于复制拓展的对象
 */
public class ShapeCache {

    //这个map里存好了对象,用的时候直接调用本类的getShape来clone就好
    private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();

    //static可以把这个方法给其他类调用,直接clone设置好的map里的对象,就不用每次都new一个对象
    public static Shape getShape(String shapeId) {
        Shape cachedShape = shapeMap.get(shapeId);
        return (Shape) cachedShape.clone();
    }

    // 对每种形状都运行数据库查询,并创建该形状
    // shapeMap.put(shapeKey, shape);
    // 例如,我们要添加三种形状
    public static void loadCache() {
        Circle circle = new Circle();
        circle.setId("1");
        shapeMap.put(circle.getId(), circle);

        Square square = new Square();
        square.setId("2");
        shapeMap.put(square.getId(), square);

        Rectangle rectangle = new Rectangle();
        rectangle.setId("3");
        shapeMap.put(rectangle.getId(), rectangle);
    }
}

克隆调用

/**
 * 模拟克隆调用
 */
public class PrototypePatternDemo {
    public static void main(String[] args) {
        ShapeCache.loadCache();

        Shape clonedShape = (Shape) ShapeCache.getShape("1");
        System.out.println("Shape : " + clonedShape.getType());

        Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
        System.out.println("Shape : " + clonedShape2.getType());

        Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
        System.out.println("Shape : " + clonedShape3.getType());
    }
}

原文地址:https://www.cnblogs.com/riches/p/11214511.html

时间: 2024-10-17 02:00:14

创建型设计模式(四)原型模式的相关文章

创建型设计模式 之 原型模式

同为创建型模式的原型模式与单例模式是密不可分的,这也是最常用的设计模式之一. 原型模式是一种非常简单的设计模式.这里除了基本介绍和演示,还详细介绍了Java中原型模式的本质. 一.介绍 同样,先来看一下<研磨设计模式>的定义——用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的本质——克隆生成对象. 那么原型模式是什么意思呢?说白了就是克隆自身.我们知道Java中没有引用这个概念,Java用变量名代表引用.像 Apple a = new Apple();我们知道,想要操

创建型设计模式之原型模式(Prototype)

结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或者 当一个类的实例只能有几个不同状态组合中的一种时.建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些. 1 using System; 2 3 // Objects which are to work as prototypes must be based on class

Java设计模式四: 原型模式(Prototype Pattern)

网上找了好多这个模型的资料说的都不透彻,看了半天都是云里雾里.只好自己操刀研究一把. 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式中的拷贝分为"浅拷贝"和"深拷贝":浅拷贝: 对值类型的成员变量进行值的复制,对引用类型

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

java语言实现创建型设计模式—抽象工厂模式

一.描述 抽象工厂模式是在工厂方法的模式上进一步抽象而来,如果说工厂方法模式是对一个产品结构的创建而言的话,那么抽象工厂模式则是针对多个产品结构而言的,它被用来一次创建多个不同的产品对象. 我们要创建一个摩托车轮胎和摩托车把手,又要创建一个自行车轮胎和自行车把手,如果我们使用工厂方法模式的话我们需要四个类:创建摩托车轮胎的工厂类,创建摩托车把手的工厂类,创建自行车轮胎的工厂类和创建自行车把手的工厂类,但是如果我们使用抽象工厂方法的话,我们需要创建两个工厂类:创建摩托车轮胎和把手的工厂类,创建自行

创建型设计模式 之 建造者模式

一.介绍 生成器模式是什么呢? <研磨设计模式中>给了这样的定义:将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表示. 生成器模式的本质——分离整体构建算法和部件构造. 其实,生成器模式的目的,便是为了构建复杂的产品,将构建算法和构造实现分离出来,以便系统可以更好的优化.扩展. 理解生成器模式主要是理解生成器2个部件,一个是生成器(Builder),一个是指导者(Director).生成器指的是整个复杂对象的构建过程.构建算法.而指导者指的是对生成器所生成的部件对象的构造

创建型设计模式(工厂模式)

在工厂模式中,我们创建对象而不将创建逻辑暴露给客户端. 首先,我们设计一个接口来表示Shape. public interface Shape { void draw(); } 然后我们创建实现接口的具体类. public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } public

创建型设计模式之工厂模式

结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 1 using System; 2 3 // These classes could be part of a framework, 4 // which

创建型设计模式总结(二)

上篇文章我们介绍了创建型设计模式的前三种:简单工厂模式.工厂方法模式和抽象工厂模式.这一篇文章,我们系统介绍一下其他的三种创建型设计模式:创建者模式.原型模式和单例模式. 一.创建者模式 创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象. 创建者模式通常包括如下几种角色: 1.建造者角色(Builder) 对复杂对象的

&quot;围观&quot;设计模式(29)--创建型设计模式总结(单例、工厂、原型、创建者)

设计模式源码下载地址 设计模式源码下载地址 1  单例模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概