设计模式之原型模式

48 阅读4分钟

原型模式是一种创建对象的设计模式,旨在通过复制现有对象来创建新对象。本博客将通过详细的代码解析,介绍C#中单例模式的概念、实现方式以及应用场景。

什么是原型模式: 原型模式是一种对象创建的设计模式,它通过复制现有对象来创建新的对象。原型模式通过避免昂贵的对象创建过程(例如数据库查询或网络请求)来提高性能。原型模式还可以隐藏对象创建的细节,使代码更加模块化和易于维护。

实现原型模式的关键构件: 在C#中实现原型模式的关键构件是接口ICloneable和类Object。接口ICloneable定义了一个允许对象克隆自身的方法Clone(),而类Object则提供了一个浅层复制方法MemberwiseClone()。这两个构件是实现原型模式的基础。

示例代码: 我们通过一个示例代码来演示原型模式的实现:

public abstract class Shape : ICloneable
{
    private string id;
    protected string type;

    public string GetId()
    {
        return id;
    }

    public string GetType()
    {
        return type;
    }

    public abstract void Draw();

    public object Clone()
    {
        object clone = null;

        try
        {
            clone = base.MemberwiseClone();
        }
        catch (Exception e)
        {
            Console.WriteLine("Clone failed: " + e.Message);
        }

        return clone;
    }
}

public class Circle : Shape
{
    public Circle()
    {
        type = "Circle";
    }

    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

public class Rectangle : Shape
{
    public Rectangle()
    {
        type = "Rectangle";
    }

    public override void Draw()
    {
        Console.WriteLine("Drawing a rectangle");
    }
}

public class Square : Shape
{
    public Square()
    {
        type = "Square";
    }

    public override void Draw()
    {
        Console.WriteLine("Drawing a square");
    }
}

public class ShapeManager
{
    private Dictionary<string, Shape> shapeCache = new Dictionary<string, Shape>();

    public void LoadCache()
    {
        Circle circle = new Circle();
        circle.GetId();
        shapeCache.Add(circle.GetId(), circle);

        Rectangle rectangle = new Rectangle();
        rectangle.GetId();
        shapeCache.Add(rectangle.GetId(), rectangle);

        Square square = new Square();
        square.GetId();
        shapeCache.Add(square.GetId(), square);
    }

    public Shape GetShape(string shapeId)
    {
        Shape shape = shapeCache[shapeId] as Shape;
        return shape.Clone() as Shape;
    }
}

class Program
{
    static void Main(string[] args)
    {
        ShapeManager shapeManager = new ShapeManager();
        shapeManager.LoadCache();

        Shape clonedCircle = shapeManager.GetShape("Circle");
        Console.WriteLine("Shape: " + clonedCircle.GetType());

        Shape clonedRectangle = shapeManager.GetShape("Rectangle");
        Console.WriteLine("Shape: " + clonedRectangle.GetType());

        Shape clonedSquare = shapeManager.GetShape("Square");
        Console.WriteLine("Shape: " + clonedSquare.GetType());
    }
}

解释示例代码: 在示例代码中,我们定义了一个抽象类Shape,它实现了接口ICloneable,并包含了一个克隆方法Clone()。然后我们定义了三个具体的形状类Circle、Rectangle和Square,它们继承自Shape类,并初始化了每个形状的类型。

在ShapeManager类中,我们创建了一个形状缓存字典来存储不同形状的原型对象。在LoadCache()方法中,我们将创建好的原型对象添加到缓存中。然后在GetShape()方法中,通过克隆原型对象来创建新的形状对象并返回。

在Main()方法中,我们先实例化一个ShapeManager对象并调用LoadCache()方法加载形状缓存。然后通过GetShape()方法获取克隆后的形状对象,并打印出每个形状的类型。

原型模式的应用场景包括:

1、当创建新对象成本较大时:例如初始化需要占用较长的时间,占用太多的CPU资源或网络资源。通过复制已有对象,可以快速得到一个新对象。

2、当系统需要保存对象的状态,而对象的状态变化很小,或者对象本身占用内存较少时:可以使用原型模式配合备忘录模式来实现。原型模式可以将对象的状态保存下来,以便在需要的时候恢复到历史某一状态,这有助于实现撤销操作。

3、当需要避免使用分层次的工厂类来创建分层次的对象时:并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。

总结: 原型模式是一种创建对象的设计模式,通过复制现有对象来创建新的对象。它能提高性能,隐藏对象创建的细节,并使代码更加模块化和易于维护。在C#中,使用接口ICloneable和类Object是实现原型模式的关键构件。

通过本文的示例代码,我们希望读者能更好地理解原型模式的概念和实现方式,并能在实际项目中灵活运用。设计模式是解决问题的有力工具,掌握不同的设计模式将有助于我们设计出高效、可维护和可扩展的软件系统。