Используем шаблон Memento совместно с Prototype

    public class ProductMemento
    {
        public int State { get; set; }
    }
    public abstract class Product
    {
        public abstract void EchoState();

        public abstract Product Clone();
    }
    [Key("myProduct")]
    public class MyProduct : Product
    {
        private int _state;
        public void SetState(int state)
        {
            _state = state;
        }
        public override void EchoState()
        {
            Console.WriteLine($"State: {_state}");
        }
        public ProductMemento SaveMemento()
        {
            return new ProductMemento
            {
                State = _state
            };
        }
        public void RestoreMemento(ProductMemento memento)
        {
            _state = memento.State;
        }
        public override Product Clone()
        {
            var clone = new MyProduct();
            clone.RestoreMemento(SaveMemento());
            return clone;
        }
    }

Прототипы обычно регистрируются в провайдере прототипов. Создадим такой на основе базового провайдера

    public class ProductPrototypeProvider : BaseProvider<Product>
    {
        public ProductPrototypeProvider(IEnumerable<Product> products)
            : base(products)
        {
        }
        public override Product Get(string key)
        {
            var prototype = base.Get(key);
            return prototype.Clone();
        }
    }

Код программы:

var prototype = new MyProduct();
prototype.SetState(123);

var productPrototypeProvider = new ProductPrototypeProvider(new Product[] { prototype });

var myProduct = productPrototypeProvider.Get("myProduct");
myProduct.EchoState();