在C#开发中,设计模式是解决常见问题的一种可复用的解决方案。以下是一些常用的C#设计模式:
单例模式(Singleton)
目的:确保一个类只有一个实例,并提供一个全局访问点。
实现方式:通过私有化构造函数和静态字段来控制实例的创建。例如:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}
适用场景:日志记录器、配置管理器等需要全局唯一实例的场景。
工厂模式(Factory)
public interface IProduct
{
void Show();
}
public class ConcreteProductA : IProduct
{
public void Show()
{
Console.WriteLine("Product A");
}
}
public class ConcreteProductB : IProduct
{
public void Show()
{
Console.WriteLine("Product B");
}
}
public class Factory
{
public IProduct CreateProduct(string type)
{
if (type == "A")
return new ConcreteProductA();
else if (type == "B")
return new ConcreteProductB();
return null;
}
}
抽象工厂模式(Abstract Factory)
public interface IProductA
{
void Show();
}
public interface IProductB
{
void Show();
}
public class ConcreteProductA1 : IProductA
{
public void Show()
{
Console.WriteLine("Product A1");
}
}
public class ConcreteProductB1 : IProductB
{
public void Show()
{
Console.WriteLine("Product B1");
}
}
public class ConcreteProductA2 : IProductA
{
public void Show()
{
Console.WriteLine("Product A2");
}
}
public class ConcreteProductB2 : IProductB
{
public void Show()
{
Console.WriteLine("Product B2");
}
}
public interface IFactory
{
IProductA CreateProductA();
IProductB CreateProductB();
}
public class ConcreteFactory1 : IFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 : IFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
建造者模式(Builder)
public class Product
{
private List<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
foreach (string part in parts)
{
Console.WriteLine(part);
}
}
}
public interface IBuilder
{
void BuildPartA();
void BuildPartB();
Product GetResult();
}
public class ConcreteBuilder : IBuilder
{
private Product product = new Product();
public void BuildPartA()
{
product.Add("PartA");
}
public void BuildPartB()
{
product.Add("PartB");
}
public Product GetResult()
{
return product;
}
}
public class Director
{
private IBuilder builder;
public Director(IBuilder builder)
{
this.builder = builder;
}
public void Construct()
{
builder.BuildPartA();
builder.BuildPartB();
}
}
原型模式(Prototype)
public interface IPrototype
{
IPrototype Clone();
}
public class ConcretePrototype : IPrototype
{
private string field;
public ConcretePrototype(string field)
{
this.field = field;
}
public IPrototype Clone()
{
return (IPrototype)this.MemberwiseClone();
}
public void Show()
{
Console.WriteLine(field);
}
}
public interface ITarget
{
void Request();
}
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Adaptee SpecificRequest");
}
}
public class Adapter : ITarget
{
private Adaptee adaptee;
public Adapter()
{
adaptee = new Adaptee();
}
public void Request()
{
adaptee.SpecificRequest();
}
}
public interface IComponent
{
void Operation();
}
public class ConcreteComponent : IComponent
{
public void Operation()
{
Console.WriteLine("ConcreteComponent Operation");
}
}
public abstract class Decorator : IComponent
{
protected IComponent component;
public Decorator(IComponent component)
{
this.component = component;
}
public virtual void Operation()
{
component.Operation();
}
}
public class ConcreteDecoratorA : Decorator
{
public ConcreteDecoratorA(IComponent component) : base(component) { }
public override void Operation()
{
base.Operation();
AddedBehavior();
}
private void AddedBehavior()
{
Console.WriteLine("ConcreteDecoratorA AddedBehavior");
}
}
public class ConcreteDecoratorB : Decorator
{
public ConcreteDecoratorB(IComponent component) : base(component) { }
public override void Operation()
{
base.Operation();
AddedBehavior();
}
private void AddedBehavior()
{
Console.WriteLine("ConcreteDecoratorB AddedBehavior");
}
}
public interface ISubject
{
void Request();
}
public class RealSubject : ISubject
{
public void Request()
{
Console.WriteLine("RealSubject Request");
}
}
public class Proxy : ISubject
{
private RealSubject realSubject;
public void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
PreRequest();
realSubject.Request();
PostRequest();
}
private void PreRequest()
{
Console.WriteLine("Proxy PreRequest");
}
private void PostRequest()
{
Console.WriteLine("Proxy PostRequest");
}
}
public class SubSystemA
{
public void OperationA()
{
Console.WriteLine("SubSystemA OperationA");
}