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里面的设计了吧。

  • 相关阅读:
    BindingException: Parameter 'approval_state' not found. Available parameters are [arg1, arg0, param1, param2]]
    vue.js学习笔记(一)——vue-cli项目的目录结构
    memcpy函数
    与、或、异或运算
    C++中的dynamic_cast和dynamic_pointer_cast
    django中orm之什么是正向查询什么是反向查询
    jquery笔记
    jquery
    前端操作数组
    Auto Layout Guide----(三)-----Anatomy of a Constraint
  • 原文地址:https://www.cnblogs.com/whtydn/p/1644135.html
Copyright © 2011-2022 走看看