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

    [导读]

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

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

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

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

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

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

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

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

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

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

    [/导读]

    上篇说到简单工厂模式, 就是通过一个类(工厂类)来完成一系列相似或近似类的实例化, 但有時候, 这个类的业务量特大,要频繁的创建实例,这样在性能与日后维护方面会造成困难, 下面就介绍把工厂类细分的过程, 其实也和上一篇的原理一样, 只是把各个子公司的计算单独创建一个类(工厂类)来负责,这就形成的工厂模式。为了大家更加明了, 前面相同的代码我还是一起贴上吧, 不然给人乱乱的感觉。

    先创建计算接口方法:

    using System;

    namespace ConsoleApp
    {
        
    public interface ISalary
        {
            
    void CommandSalary();
        }
    }

    再创建二个子公司的计算类:

    代码
    using System;

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

    下面是深圳子公司:

    代码
    using System;

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

    到这里, 基本的类已经定义好, 下面就要开始进行工厂类设计了, 首先还是定义工厂类的接口:

    using System;

    namespace ConsoleApp
    {
        
    public interface IFactory
        {
            ISalary CreateSalary();
        }
    }

    这样就需要定义二个子公司实现的工厂类:

    代码
    using System;

    namespace ConsoleApp
    {
        
    public class BeiJinSalaryFactory : IFactory
        {
            
    public ISalary CreateSalary()
            {
                
    return new BeiJinSalary();
            }
        }
    }

    深圳子公司的工厂类: 

    代码
    using System;

    namespace ConsoleApp
    {
        
    public class ShenZhenSalaryFactory : IFactory
        {
            
    public ISalary CreateSalary()
            {
                
    return new ShenZhenSalary();
       
         }
        }
    }

    调用时代码实现如下,先实例化工厂类, 然后通过工厂类来返回相应的实例:

    代码
    using System;

    namespace ConsoleApp
    {
        
    class Program
        {
            
    public static void Main(string[] args)
            {
              
    //调用时代码实现如下,先实例化工厂类, 然后通过工厂类来返回相应的实例:
                IFactory Factory = new BeiJinSalaryFactory(); //实例化北京子公司工厂类
                ISalary SalaryBJ = Factory.CreateSalary();  //创建北京子公司计算模块的类
                SalaryBJ.CommandSalary();

                
    /*这里有好多其它的代码*/

                Factory 
    = new ShenZhenSalaryFactory();  //实例化深圳子公司工厂类
                ISalary SalarySZ = Factory.CreateSalary(); //创建深圳子公司计算模块的类
                SalarySZ.CommandSalary();

                Console.ReadLine();
            }
        }
    }

     工厂模式也是一样, 都是通过一个工厂类来完成对象的实例化,但注意的是, 每一个抽象类都会单独创建一个工厂类, 当需要添加一个子公司时, 只需要增加添加部分,例如:建一个子公司的类,一个子公司的工厂类,与原先定义好其它子公司的类没什么相联,方便系统设计, 维护也简单, 修改时的代码量也相应的少了部分。但这个工厂模式,在调用的时候需要先实例化工厂类, 再通过工厂类来返回一个子公司对象类, 工序发生了变化, 当然最后结果都是一样, 但代码量增加了不少, 层次关系也复杂了, 有点像PetShop里面的设计了吧。

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/whtydn/p/1644135.html
Copyright © 2011-2022 走看看