zoukankan      html  css  js  c++  java
  • 设计模式--工厂方法和抽象工厂

    这两个我觉得挺类似的,然后仔细了解下才发现具体区别。

    工厂方法:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使得一个类的实例化延迟到其子类。

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

    区别:

    工厂方法返回单个对象的接口,而抽象工厂返回的是一系列相关对象的接口。

    工厂方法:

    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返回的是单个方法的接口。

  • 相关阅读:
    表达式和计算的描述
    表达式和计算的描述
    递归算法浅谈
    编程基本功训练:流程图画法及练习
    【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
    VS2008下直接安装使用Boost库1.46.1版本号
    android关键组件service服务(一)
    U盘安装咱中国人自己的操作系统UbuntuKylin14.04LST(超具体原创图文教程)
    数据流图的画法
    匈牙利算法
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6726054.html
Copyright © 2011-2022 走看看