设计模式之一【原型模式】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38361347/article/details/85089240

java设计模式之原型模式

原型模式属于创建型模式之一,用于创建重复的对象,即可以保证性能又能创建对象!

什么时候采用此种设计模式,当我们创建对象代价比较大的时候,我们就可以采用这种方法,用来创建对象。

原意义上是通过对对象的拷贝从而达到创建对象的目的。

具体实现步骤:

首先创建一个抽象接口类:

/**
 * 原型模式
 * 当创建对象代价较大时采用这种模式,创建对象。
 * 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
 *
 * 克隆对象
 */



//抽象类
public abstract class PrototypeAbstract  implements  Cloneable{


    protected  String name;
    private  String grade;


    abstract void doTest();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }


    //克隆对象
    @Override
    protected Object clone() throws CloneNotSupportedException {
            Object object = null;
            if(object==null){
                object = super.clone();
            }
        return object;
    }
}

实现类

public class Shape extends PrototypeAbstract {



    @Override
    void doTest() {
        System.out.println("shape...");
    }


    public  Shape() {
        name="shape";
    }
}

核心代码

首先创建一个map用来保存对象
buildObject方法是用来创建对象,并且是static 无论外面条用多少次,始终对象保持只有一个。
然后对外提供获取对象的方法,从map中得到对象,调用clone方法,将对象克隆复制一份,返回给调用者。
public class ShapeCache {

    //存储对象
    private static Map<String,PrototypeAbstract> map = new Hashtable<>();

    //对外提供获取对象的方法
    public static PrototypeAbstract getPrototype (String id){
        //获取对象
        PrototypeAbstract prototypeAbstract = map.get(id);

        Object clone = null;
        try {
            //将获取到的对象直接克隆一个返回给调用者
            clone = prototypeAbstract.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return (PrototypeAbstract) clone;
    }



    //创建对象
    public static void buildObject(){

        //原对象
        PrototypeAbstract prototypeAbstract = new Shape();
        prototypeAbstract.setName("shape");
        prototypeAbstract.setGrade("shape");


        //可以多个创建...

        //存储
        map.put(prototypeAbstract.getGrade(),prototypeAbstract);

    }

}

测试方法

public class Test {



//原型模式创建对象测试
public static void main(String[] args) {
    //创建对象,只需创建一次
    ShapeCache.buildObject();
    //获取对象
    Shape prototype = (Shape) ShapeCache.getPrototype("shape");
    System.out.println(prototype.getName());


}

}

这样做的目的,避免大量重复创建对象,对象创建一次,需要用的时候直接进行拷贝克隆!

猜你喜欢

转载自blog.csdn.net/weixin_38361347/article/details/85089240