• 设计模式--工厂方法和抽象工厂


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

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

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

    区别:

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

    工厂方法:

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

  • 相关阅读:
    刚刚找到的IP地址对应地区数据库
    SQL2000中像SQL2005中的Row_Number一样获取行号
    KindEditor3.4.4版的ASP.NET版本
    使用程序代码输出论坛回复第X层楼
    IIS上启用Gzip压缩(HTTP压缩)详解(PDF)
    ASP.NET中过滤HTML字符串的两个方法
    七个受用一生的心理寓言
    Android获取其他包的Context实例然后XX(转载)
    android junit基础教程
    java获取web容器地址
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6726054.html
Copyright © 2020-2023  润新知