这两个我觉得挺类似的,然后仔细了解下才发现具体区别。
工厂方法:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使得一个类的实例化延迟到其子类。
抽象工厂:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。
区别:
工厂方法返回单个对象的接口,而抽象工厂返回的是一系列相关对象的接口。
工厂方法:
 public class Operation
    {
public double NumberA { get; set; }
        public double NumberB { get; set; }
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
}
 public class OperationAdd:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
 public class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }
 public class OperationMul:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }
 public class OperationDiv:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除数不能为0");
            result = NumberA / NumberB;
            return result;
        }
    }
//定义工厂接口
interface IFactory
    {
        Operation CreateOperation();
    }
//实现具体工厂
 class AddFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }
 class SubFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
 class MulFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
 class DivFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }
抽象工厂:
 class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
 interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }
//不同数据库类实现接口
class SqlUser : IUser
    {
        public User GetUser(int id)
        {
            Console.WriteLine("sql获取一条id=" + id + "的记录");
            return null;
        }
        public void Insert(User user)
        {
            Console.WriteLine("sql添加一天记录:" + user.Id + "  " + user.Name);
        }
    }
class AccessUser : IUser
    {
        public User GetUser(int id)
        {
            Console.WriteLine("access获取一条id=" + id + "的记录");
            return null;
        }
        public void Insert(User user)
        {
            Console.WriteLine("access添加一天记录:" + user.Id + "  " + user.Name);
        }
    }
//根据不同db创建不同db的实现对象(反射+配置文件实现数据库访问)
//添加配置文件结点
 <appSettings>
    <add key="DB" value="Sql"/>
  </appSettings>
//添加创建对象类
class CreateByDB
    {
        static readonly string db = ConfigurationManager.AppSettings["DB"];//获取配置文件数据库类型名称
        static string AssemblyName = "抽象工厂模式3";//程序集名称
        public static IUser CreateUser()
        {
            string className = AssemblyName + "." + db + "User";
            return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);//根据程序集和类名创建具体类型
        }
    }
调用:
 User user = new User() { Id = 5, Name = "name5" };
            IUser iu = CreateByDB.CreateUser();//这里就会根据配置文件的数据库名称创建对应的实例
            iu.Insert(user);
            iu.GetUser(6);
//要切换数据库只需修改配置文件。前提多个数据库的实现都得提前写好。比如还有其他数据库 orical,得把orical实现IUser的类写好。
//区别重点就在于 IUser,返回的是一系列相关对象的接口。而工厂方法里的Operation返回的是单个方法的接口。
原文:http://www.cnblogs.com/buzhidaojiaoshenme/p/6726054.html