# 工厂模式
属于创建型模式,是常用的设计模式之一。
工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只需要增加这个产品的类就可以了。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
- 使用 CSharp 反射动态创建对象会有性能消耗
- 一定程度上增加了系统的复杂度
# 类图
- 创建接口,由具体的类实现接口
- 创建工厂类,利用反射动态创建对象
# 代码
# 接口
| namespace CreationalPatterns_FactoryPattern |
| { |
| public interface IShape |
| { |
| |
| |
| |
| public void MyShape(); |
| } |
| } |
| namespace CreationalPatterns_FactoryPattern |
| { |
| public interface IEffect |
| { |
| |
| |
| |
| public void MyEffect(); |
| } |
| } |
# 实现接口的类
| namespace CreationalPatterns_FactoryPattern |
| { |
| public class RoundShape : IShape |
| { |
| public void MyShape() |
| { |
| Console.WriteLine("圆形"); |
| } |
| } |
| } |
| namespace CreationalPatterns_FactoryPattern |
| { |
| public class SquareShape : IShape |
| { |
| public void MyShape() |
| { |
| Console.WriteLine("正方形"); |
| } |
| } |
| } |
| namespace CreationalPatterns_FactoryPattern |
| { |
| internal class ExplodeEffect : IEffect |
| { |
| public void MyEffect() |
| { |
| Console.WriteLine("爆炸"); |
| } |
| } |
| } |
| namespace CreationalPatterns_FactoryPattern |
| { |
| internal class TransparencyEffect : IEffect |
| { |
| public void MyEffect() |
| { |
| Console.WriteLine("透明"); |
| } |
| } |
| } |
# 工厂
- 利用泛型方法将 “创建对象” 与 “创建某个具体的对象” 分离开
- 根据命名规则,利用反射创建对象(命名空间. + 类名 + 特定的字符)
- 如果反复创建同一个物体会造成浪费,所以用一个字典储存起来(这不是必要的,需要看需求)
| namespace CreationalPatterns_FactoryPattern |
| { |
| public class CreateFactory |
| { |
| |
| |
| |
| private static Dictionary<string, object> Cache = new Dictionary<string, object>(); |
| |
| |
| |
| |
| |
| |
| |
| private static T CreateObject<T>(string className) where T : class |
| { |
| if (Cache.ContainsKey(className)) |
| { |
| return Cache[className] as T; |
| } |
| else |
| { |
| Type type = Type.GetType(className); |
| object temp = Activator.CreateInstance(type); |
| Cache.Add(className, temp); |
| return temp as T; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| public static IShape GetShape(string shapeName) |
| { |
| |
| string className = string.Format("CreationalPatterns_FactoryPattern.{0}Shape", shapeName); |
| return CreateObject<IShape>(className); |
| } |
| |
| |
| |
| |
| |
| |
| public static IEffect GetEffect(string effectName) |
| { |
| |
| string className = string.Format("CreationalPatterns_FactoryPattern.{0}Effect", effectName); |
| return CreateObject<IEffect>(className); |
| } |
| } |
| } |
# 测试
| namespace CreationalPatterns_FactoryPattern |
| { |
| public class Program |
| { |
| private static void Main() |
| { |
| CreateFactory.GetShape("Round").MyShape(); |
| CreateFactory.GetShape("Square").MyShape(); |
| CreateFactory.GetEffect("Explode").MyEffect(); |
| CreateFactory.GetEffect("Transparency").MyEffect(); |
| } |
| } |
| } |