前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Design Patterns 15 - 抽象工厂模式

Design Patterns 15 - 抽象工厂模式

作者头像
Reck Zhang
发布2021-08-11 11:00:33
2130
发布2021-08-11 11:00:33
举报
文章被收录于专栏:Reck Zhang

抽象工厂模式

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

抽象工厂的优点与缺点

  • 优点
    1. 易于交换产品系列, 由于具体工厂类, 例如IFactory factory = new AccessFactory(), 在一个应用中只需要初始化的时候出现一次, 这就使得改变一个应用的具体工厂变得非常容易, 他只需要改变具体工厂即可使用不同的产品配置.
    2. 他让具体的创建实例过程与客户端分离, 客户端是用过他们的抽象接口操纵实例, 产品的具体类名也被具体工厂的实现分离, 不会出现在客户代码中.
  • 缺点
    1. 如果需求来自增加功能, 即增加方法, 那么对于每一种产品系列都要添加相应方法及其抽象类, 同时对于每种工厂类和抽象工厂类都要进行改动.
    2. 每一个类的开始都需要声明IFactory factory = AccessFactory(), 那么假如有100个调用该工厂的类, 在需要改动的时候要改动100次.

反射+抽象工厂

反射格式:

代码语言:javascript
复制
Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
代码语言:javascript
复制
using System.Reflection;

IUser result = (IUser)Assembly.Load("抽象工厂模式").CreateInstance("抽象工厂模式".AccessUser);

之前选择产品类型的工厂是通过在编译前就决定的, 而反射通过字符串来实例化对象, 可以用变量来处理, 根据需要更换.

代码语言:javascript
复制
using System.Reflection;

class DataAccess {
    private static readonly string AssemblyName = "抽象工厂模式";
    private static readonly string db = "Sqlserver";

    public static IUser CreateUser() {
        string className = AssemblyName + "." + db + "User";
        return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
    }

    public static IDepartment CreateDepartment() {
        string className = AssemblyName + "." + db + "Department";
        return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
    }
}

但是在更换数据库访问时, 我们还是需要去改程序(更改db这个字符串的值)重编译, 不符合开放-封闭原则.

反射+配置文件

利用配置文件给DB字符串赋值.

代码语言:javascript
复制
<?xml version = "1.0" encoding = "utf=8" ?>
<configuration>
    <appSettings>
        <add key = "DB" value = "Sqlserver"/>
    </appSettings>
</configuration>

所有在用简单工厂的地方, 都可以考虑用反射技术来去除switch或if, 解除分支判断带来的耦合.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象工厂模式
    • 抽象工厂的优点与缺点
      • 反射+抽象工厂
        • 反射+配置文件
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档