欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式——原型模式

程序员文章站 2022-08-17 15:45:23
原型模式_通过复制生成实例(避免实例重复创建从而减少内存消耗) 阅读前准备 1、浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。(如:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2中依然包含 ......

原型模式_通过复制生成实例(避免实例重复创建从而减少内存消耗)

阅读前准备

  • 1、浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
    (如:对象a1中包含对b1的引用,b1中包含对c1的引用。浅拷贝a1得到a2,a2中依然包含对b1的引用,
    b1中依然包含对c1的引用。深拷贝则是对浅拷贝的递归,深拷贝a1得到a2,a2中包含对b2(b1的copy)的引用,b2中包含对c2(c1的copy)的引用)
  • 2、深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象
    (需要重写clone方法.如
    @override
          protected object clone() throws clonenotsupportedexception {
            husband husband = (husband) super.clone();
              husband.wife = (wife) husband.getwife().clone();
            return husband;
         }
      )

    设计模式——原型模式

/**
 * 产品生成管理器
 * @author maikec
 * @date 2019/5/11
 */
public final class productmanager {
    private final map<string, product> productmap = collections.synchronizedmap(new hashmap<>(  ));
    public void register(product product){
        productmap.put( product.getclass().getsimplename(),product );
    }
    public product create(product product){
        product result = productmap.get( product.getclass().getsimplename() );
        if(null == result){
            register( product );
            result = productmap.get( product.getclass().getsimplename() );
        }
        return result.createclone();
    }
}

/**
 * 原型类
 * @author maikec
 * @date 2019/5/11
 */
public interface product extends cloneable {
    void use();

    /**
     * 克隆
     * @return
     */
    product createclone();
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class clonefailureexception extends runtimeexception {
    public clonefailureexception(){
        super("clone failure");
    }
    public clonefailureexception(string msg){
        super(msg);
    }
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class messageproduct implements product {
    @override
    public void use() {
        system.out.println( "messageproduct" );
    }

    @override
    public messageproduct createclone() {
        try {
            return (messageproduct) clone();
        } catch (clonenotsupportedexception e) {
            e.printstacktrace();
            throw new clonefailureexception(  );
        }
    }
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class underlineproduct implements product {
    @override
    public void use() {
        system.out.println( "underlineproduct" );
    }

    @override
    public underlineproduct createclone() {
        try {
            return (underlineproduct) clone();
        } catch (clonenotsupportedexception e) {
            e.printstacktrace();
            throw new clonefailureexception();
        }
    }
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class prototypedemo {
    public static void main(string[] args) {
        productmanager manager = new productmanager();
        manager.register( new underlineproduct() );
        manager.register( new messageproduct() );

        manager.create(  new underlineproduct()  ).use();
        manager.create(  new messageproduct()  ).use();
    }
}

 

附录

github.com/maikec/patt… 个人github设计模式案例

声明

引用该文档请注明出处