zoukankan      html  css  js  c++  java
  • [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)

    [导读]

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

    [设计模式整理笔记 二] 简单工厂模式(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的工资计算模块

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

  • 相关阅读:
    About Spring
    execle导入后 数据 无刷新 显示在 输入页面
    前端小神龟 -- 分页导航栏
    如何在mysql命令窗口获取到程序正在执行的sql语句
    div+css(ul li)实现图片上文字下列表布局
    C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)
    台灣VR內容產業聯盟_技術推廣中心
    2014新的一年到来,祝大家新年快乐
    matlab 提取文件路径名称,用于实现遍历读取文件(我的目的是遍历图像)
    无监督学习一些算法的简要概括(一)-稀疏自编码
  • 原文地址:https://www.cnblogs.com/whtydn/p/1644774.html
Copyright © 2011-2022 走看看