抽象工厂模式

[ AbstractFactory ]

提供一个创建一系列相关或相互依赖对象的接口 , 而无需指定它们具体的类 。


抽 象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端 提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因 此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类 负责创建抽象产品的具体子类的实例。


当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每 个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
  
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。



最新抽象工厂升级应用:
简单工厂模式 + 反射机制 , 提高灵活 、扩展性 、可维护性 、可复用性 和 降低耦合度




源码 :

class User
{
  public int ID { get; set; }
  public string Names { get; set; }
}



interface IUser
{
  void Insert(User user);
  void GetModel(int id);
}



class AccessUser : IUser
{
  public void Insert(User user)
  {
    Console.WriteLine("Access 数据库添加用户 "+user.Names);
  }

  public void GetModel(int id)
  {
    Console.WriteLine("Access 数据库获取用户ID "+id);
  }
}



class SqlUser : IUser
{
  public void Insert(User user)
  {
    Console.WriteLine("Sql Server 数据库添加用户 "+user.Names);
  }

  public void GetModel(int id)
  {
    Console.WriteLine("Sql Server 数据库获取用户ID "+id);
  }
}



class DataAccess
{
  // <summary>
  // 简单工厂模式 + 反射机制 , 提高灵活 、扩展性 、可维护性 、可复用性 和 降低耦合度
  // </summary>
  // <returns></returns>
  public static IUser CreateUser()
  {
    CreateInstance("SqlUser"); SqlUser 最好写在配置文件里 , 这样可以提高灵活性
    return (IUser)Assembly.Load("AbstractFactory2").CreateInstance("AbstractFactory2.SqlUser");
  }
}



class Program
{
  static void Main(string[] args)
  {
     //简单工厂模式 + 反射机制 实现数据库类型的更换, 提高灵活 、扩展性 、可维护性 、可复用性 和 降低耦合度

    IUser user = DataAccess.CreateUser();
    User model = new User();
    model.ID = 10;
    model.Names = "赵";
    user.Insert(model);
    user.GetModel(1);

    Console.Read();
  }
}

posted on 2012-02-21 12:54  多个马甲  阅读(216)  评论(0编辑  收藏  举报