zoukankan      html  css  js  c++  java
  • 不一样的原型模式(设计模式八)

    前言

    原型模式解决的是什么问题呢?有一个问题就是在软件系统中,经常面临着"某些结构复杂的对象"的创建工作,由于工作的需要这些对象经常面临着巨大的变化,但是却有某些稳定的接口,初始化对象不是特别想要的,那么可以考虑到原型模式。还有一个就是希望保持或者使用一个中间状态,也就是说希望传入的值不改变。

    正文

    [Serializable]
    public class Person : ICloneable
    {
    	public object Clone()
    	{
    		return this.MemberwiseClone();
    	}
    
    	public Person DeepClone()
    	{
    		return SerializeHelper.DeepClone(this);
    	}
    }
    

    然后调用就是:

    public class Application
    {
    	Person person;
    	public Application(Person person)
    	{
    		this.person = person;
    	}
    
    	public void doSomeThing()
    	{
    		 person.Clone();//假如person没有引用
    		 person.DeepClone();//加入person 有引用
    	}
    }
    

    这里就有一个问题了,按理说原型模式应该是深克隆啊,为啥写了一个浅克隆呢?

    我们知道深克隆是克隆的时候会引用到对象的引用对象,但是如果没有的话,那么浅克隆效率就很高了。

    那么这里就有一个问题了,我这里传入的是person啊,不是接口啊。这个因为Application现在是稳定的,Application不会去使用person以外的其他结构。

    这种方式同时是用于隔离类对象的使用者和具体类型之间的耦合关系。这里用person一个实体类举例不太好,应该用一个接口来举例。

    那么可以想象一下,如果现在是接口例子,前面工厂是使用工厂来创建,现在就是用clone来创建而已。

    同样可以用静态方式实现;

    [Serializable]
    public class Person : ICloneable
    {
    	public object Clone()
    	{
    		return this.MemberwiseClone();
    	}
    
    	public Person DeepClone()
    	{
    		return SerializeHelper.DeepClone(this);
    	}
    
    	private static Person _person;
    	static Person()
    	{
    		_person = new Person();
    	}
    	public static Person StaticClone()
    	{
    		return _person.MemberwiseClone() as Person;
    	}
            public static Person StaticDeepClone()
    	{
    		return SerializeHelper(_person);
    	}
    }
    

    概念图

    后续补上

  • 相关阅读:
    Hack World和CTFHub布尔注入记录
    MySQL updatexml()、extractvalue() 报错型SQL注入
    常见的Web源码泄漏漏洞及其利用(转载记录)
    大白
    [强网杯 2019]随便注
    [极客大挑战 2019]LoveSQL 1
    Mysql--事物
    Android深度探索-卷1第十章心得体会
    Android深度探索-卷1第八章心得体会
    Android深度探索-卷1第九章心得体会
  • 原文地址:https://www.cnblogs.com/aoximin/p/13599899.html
Copyright © 2011-2022 走看看