设计模式(创建型模式):抽象工厂

介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 —— 抽象工厂。 那什么是抽象工厂呢? 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象 的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 说起来,抽象工厂与工厂方法类似,但与工厂不同的是抽象工厂不再提供一个单一的抽象产品创建。而是提供了同一产品族不同产品等级结构的创建方式。 这里解释一下两个名词: 产品等级结构 在之前的工厂方法当中,一个工厂只能创建一个产品,这个产品可能会有多层继承产品。 比如说有一个抽象产品电视机,那么可能是苹果手机这一个抽象产品,但是苹果手机有 多个版本,可能会有 IPHONE5s,IPHONE6,IPHONE7,IPHONE7PLUGS。所以产品结构就 是一个产品的继承结构,比如我们之前的工厂方法只能生成苹果手机而已。 产品族 产品族指代的就是由同一个工厂生产的,但是位于不同产品结构中的一组产品。还是 举个例子,苹果公司不可能生产苹果手机,当然他还有苹果电脑,苹果手表等。所以,一 个工厂就是一个产品族。 So,在这里说白了我们就是在之前的工厂方法当中进行了一个扩展,使得抽象工厂类不再产生单一的产品结构,而是可以生产多个不同的产品结构,而实现工厂就是不同的产品族。 抽象工厂实现了开闭原则,即要求系统对扩展开放,对修改封闭,通过扩展达到增强其功能的目的。 在这里增加产品族很方便,只需要增加一个工厂即可,对已有的代码无需任何修改。 但是增加产品结构,必须修改抽象工厂类,然后所有实现类都需要更改,不能很好的支持“开闭原则”。 接下来就上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 // 电脑产品 public abstract class Computer { public abstract void Run(); } // 手机产品 public abstract class Phone { public abstract void Run(); } public class AppleComputer : Computer { public override void Run() { Console.

浅谈模块系统与 ABP 框架初始化

在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期。分别是: PreInitialze(); Initialize(); PostInitialize(): ShutDown(); AddAbp() 在初始化 ABP 框架的时候,通过 services.AddAbp<AbpTestMulitPageWebHostModule>方法将启动模块作为泛型参数传入到 AddAbp 当中。 之后根据传入的启动模块,初始化 AbpBootstrapper,在 AbpBootstrapper 初始化的时候执行拦截器注册等操作。 之后配置 Asp Net Core 相关服务,替换控制器、视图组件、过滤器等默认实现,改用ABP 框架的实现,并且将 Ioc 容器替换为 CastleWindsor。 app.UseAbp() 之前的 AddAbp 仅仅是在 ConfigureService 注入服务,紧接着就会在 Configure方法启用 Abp 中间件。 1 2 3 4 5 private static void InitializeAbp(IApplicationBuilder app) { var abpBootstrapper = app.ApplicationServices.GetRequiredService<AbpBootstrapper>(); abpBootstrapper.Initialize(); } 可以看到在初始化 ABP 的时候,实际上是从 Ioc 容器中解析出 AbpBootStrapper 调用它的初始化方法。 AbpBootStrapper.Initialize() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public virtual void Initialize() { ResolveLogger(); try { RegisterBootstrapper(); IocManager.

浅谈工作单元 在整个 ABP 框架当中的应用

ABP在其内部实现了工作单元模式,统一地进行事务与连接管理。 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of Work 特性的方法进行操作,在执行完方法之后就会关闭掉工作单元。 其整体流程大概如下: 首先 UOW 相关接口、拦截器等通过 IocManager 注入到 Ioc 容器当中。 监听 Ioc 注册事件,并为其添加方法拦截器。 在拦截器内部使用 using 包裹数据库操作方法,使其成为一个工作单元。 一旦在方法 procced 执行的时候,产生任何异常触发任何异常都不会执行 Complete 方法,直接抛出终止执行。 UnitOfWorkInterceptors 这是一个 Castle Interceptors 的实现,在 AbpBootStrap 的 Initialze 方法当中被注入到 Ioc 容器。 1 2 3 4 5 6 7 8 private void AddInterceptorRegistrars() { ValidationInterceptorRegistrar.Initialize(IocManager); AuditingInterceptorRegistrar.Initialize(IocManager); EntityHistoryInterceptorRegistrar.Initialize(IocManager); UnitOfWorkRegistrar.Initialize(IocManager); AuthorizationInterceptorRegistrar.Initialize(IocManager); } 之后在 Registrar 内部针对组件注入事件进行绑定: 1 2 3 4 5 6 7 8 9 public static void Initialize(IIocManager iocManager) { iocManager.

设计模式(创建型模式):工厂方法

介绍完简单工厂之后,现在就来介绍一下工厂方法模式。之前简单工厂有一个弊端就是每次你需要产生新的产品的时候都需要对创建工厂类进行更改,如同前一篇文章说过的一样最后的后果是工厂类会变得十分庞大。 而工厂方法模式就是对简单工厂的进一步抽象,引入了抽象工厂,而具体的产品则由具体的产品工厂来进行构建。从而将创建对象的工作从一个工厂当中分离出来,转而延迟到具体的产品工厂来进行实例化。 所以,在工厂方法模式当中,由这 4 个对象构成: 抽象工厂 具体工厂 抽象产品 具体产品 抽象工厂用于用于定义创建产品等抽象方法,而具体工厂则实习现这些接口用来创建具体产品。我们用来代码来实现。 抽象工厂: 1 2 3 4 public abstract class AbsFactory { public abstract Food CreateFood(); } 具体工厂A: 1 2 3 4 5 6 7 public class FactoryA : AbsFactory { public override Food CreateFood() { return new FoodA(); } } 具体工厂B: 1 2 3 4 5 6 7 public class FactoryB : AbsFactory { public override Food CreateFood() { return new FoodB(); } } 抽象产品:

设计模式(创建型模式):简单工厂

在设计模式当中有三大工厂,分别是 简单工厂、抽象工厂、工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现。 简单工厂一般由以下几个对象组成: 对象 作用 工厂类 负责创建产品 抽象产品类 工厂创建出来的产品抽象 具体产品类 继承自抽象产品类,具体的产品功能 那么我们为什么不直接 new 一个对象来执行操作呢?如果有以下代码: 1 2 3 4 5 6 7 8 public class BusinessClass { public void Process() { Car _car = new Car(); _car.Run(); } } 这么写的话,一旦我们业务逻辑发生变化,我不想创建 Car 对象了,我想创建一个 AirPlane 对象,他也具有 Run 方法,这个时候这种写法就很尴尬了,我需要在后面加一个 AirPlane air = new AirPlane() 然后再 Run。 而工厂模式则将创建与使用分离开来,用户不用关心怎么创建的,只需要告诉工厂你需要哪种类型的对象,我给你创建好,你直接调用即可。乍一看来没有什么改变,但之前直接 new 对象的方式则造成 BusinessClass 对于 Car 等对象造成了一种依赖关系。 换句话说,如果按照上面那种方式书写,BusinessClass 则是依赖于 Car 对象的,而简单工厂则是降低对象之间的耦合度(依赖)的。 在上面的例子中,我们要封装他们的改变,他们之间改变的地方在于实例的创建,那么我们封装之后就由工厂来进行创建,便有以下代码: 抽象产品类: 1 2 3 4 public abstract class Product { void Run(); } 再有一个工厂类:
Built with Hugo
主题 StackJimmy 设计