随笔 - 163  文章 - 2  评论 - 370  阅读 - 46万 

[导读]

[设计模式整理笔记 一] 基础知识

[设计模式整理笔记 二] 简单工厂模式(Simple Factory)

[设计模式整理笔记 三] 工厂模式(Factory)

[设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)

[设计模式整理笔记 五] 创建者模式(Builder)

[设计模式整理笔记 六] 工厂模式与创建者模式总结

[设计模式整理笔记 七] 原型模式(ProtoType)

[设计模式整理笔记 八] 单例模式(Singleton)

[设计模式整理笔记 九] 外观模式(Facade)

....后续, 包括部分例子

[/导读]

 

 

 

前面的记有简单工厂模式,他的实现所有产品都是在同一个工厂类来实现, 采用静态的方法来返回实例; 工厂模式就是根据不同的产品创建不同的工厂类来返回实例,即使二个产品有某些联系, 还是用二个工厂类来返回实例。 那么抽象工厂类呢? 它是把多个有联系的产品建立一个工厂类, 是针对一系列的产品的。 例如上面的工资计算模块: 深圳北京子公司ITD部门需要另一种计算方式 , HRA部门需要的又是另一种,或深圳子公司下面又有再下一级的子公司,很明显然,各子公司的ITD部门是一系列的, 或者各城市下面的二级子公司也是一系列的, 这样我们就需要用到抽象工厂模式来设计了, 下完整代码:

定义产品接口方法:

复制代码
using System;

namespace ConsoleApp
{
    
public interface ISalary
    {
        
void CommandSalary();
    }
}
复制代码

 

定义二个子公司的抽象类:

深圳子公司:

复制代码
代码
using System;

namespace ConsoleApp
{
    
public abstract class ShenZhenSalary : ISalary
    {
        
public virtual void CommandSalary()
        {
            Console.WriteLine(
"这是深圳子公司的工资计算模块");
        }
    }
}
复制代码

北京子公司:

复制代码
代码
using System;

namespace ConsoleApp
{
    
public abstract class BeiJinSalary : ISalary
    {
        
public virtual void CommandSalary()
        {
            Console.WriteLine(
"这是北京子公司的工资计算模块");
        }
    }
}
复制代码

 

既然需要添加ITD,HRA二个部门的计算模块, 那就需要在深圳子公司计算的类下面派生出ITD, HRA类, 北京方面也是如此:

北京子公司计算工资的类下面派生出BeiJinItdSalary,BeiJinHraSalary类:

复制代码
代码
    public class BeiJinItdSalary : BeiJinSalary
    {
        
public override void CommandSalary()
        {
            Console.WriteLine(
"这是北京子公司ITD的工资计算模块");
        }
    }

    
public class BeiJinHraSalary : BeiJinSalary
    {
        
public override void CommandSalary()
        {
            Console.WriteLine(
"这是北京子公司HRA的工资计算模块");
        }
    }
复制代码

 

深圳子公司计算工资的类下面派生出ShenZhenItdSalary,ShenZhenHraSalary类:

复制代码
代码
    public class ShenZhenItdSalary : ShenZhenSalary
    {
        
public override void CommandSalary()
        {
            Console.WriteLine(
"这是深圳子公司ITD的工资计算模块");
        }
    }

    
public class ShenZhenHraSalary : ShenZhenSalary
    {
        
public override void CommandSalary()
        {
            Console.WriteLine(
"这是深圳子公司HRA的工资计算模块");
        }
    }
复制代码

 

这样就定义完成一系列产品(把部门当成工厂类的产品,下面也是这样解释)的类了, 下面就是设计怎样来管理这些类。首先需要定义一个工厂类的接品方法:

复制代码
using System;

namespace ConsoleApp
{
    
public interface IFactory
    {
        ShenZhenSalary CreateShenZhenSalary();
        BeiJinSalary CreateBeiJinSalary();
    }
}
复制代码

 

根据上面的介绍, 把产品分为二系列, 分别是ITD与HRA,下面就需要定义ITD与HRA二个产品的工厂类了吧!

ITD工厂类: 

复制代码
代码
using System;

namespace ConsoleApp
{
    
public class ItdFactory : IFactory
    {
        
public ShenZhenSalary CreateShenZhenSalary()
        {
            
return new ShenZhenItdSalary();
        }
        
public BeiJinSalary CreateBeiJinSalary() 
        {
            
return new BeiJinItdSalary();
        }
    }
}
复制代码

  

HRA工厂类:

复制代码
代码
using System;

namespace ConsoleApp
{
   
public class HraFactory:IFactory
    {
       
public ShenZhenSalary CreateShenZhenSalary()
       {
           
return new ShenZhenHraSalary();
       }
       
public BeiJinSalary CreateBeiJinSalary()
       {
           
return new BeiJinHraSalary();
       }
    }
}
复制代码

 

 

 这样就已经完成了一系列产品的定义, 其它子公司部门计算方式添加进来, 不会影响原先存在的代码, 方便维护, 下面列出调用这些工厂类的方法:

复制代码
代码
using System;

namespace ConsoleApp
{
    
class Program
    {
        
public static void Main(string[] args)
        {
            IFactory Factory 
= new ItdFactory();  //实例化Itd工厂类
            ShenZhenSalary SalarySzItd = Factory.CreateShenZhenSalary();
            SalarySzItd.CommandSalary(); 
//调用深圳ITD公司计算过程

            BeiJinSalary SalaryBjItd 
= Factory.CreateBeiJinSalary();
            SalaryBjItd.CommandSalary(); 
//调用北京ITD公司计算过程

            Factory 
= new HraFactory(); //实例化Hra工厂类
            ShenZhenSalary SalarySzHra = Factory.CreateShenZhenSalary();
            SalarySzHra.CommandSalary(); 
//调用深圳Hra公司计算过程

            BeiJinSalary SalaryBjHra 
= Factory.CreateBeiJinSalary();
            SalaryBjHra.CommandSalary(); 
//调用北京Hra公司计算过程

            Console.ReadLine();
        }
    }
}
复制代码

 

输出:

这是深圳子公司ITD的工资计算模块

这是北京子公司ITD的工资计算模块

这是深圳子公司HRA的工资计算模块

这是北京子公司HRA的工资计算模块

 

抽象工类模式其实分为:抽象工厂类,实现抽象工厂类的具体返回实例的工厂类,抽象产品类,具体产品类,和工厂模式差不多, 区别就是抽象工厂模式把一系列的产品进行统一。

 

posted on   风浪  阅读(2089)  评论(11编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示