zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式读后感

    作者(大话设计模式)以生动的比喻,从简单工厂模式到工厂模式,最后到抽象工厂模式,极其美妙的描述了工厂模式。

    简单工厂模式(以一个简单的加减乘除计算器为例)

    初学者代码:

    Class Operation{
         Double a;
         Double b;
         public Double Add(){
              return a+b;
         }
         public Double Sub(){
              return a-b;
         }
         public Double Mul(){
              return a*b;
         }
    }
    
    

    这样的代码对完成当前的功能没问题,关键是在复用和扩展方面很差,如果要新增一个运算功能,只能去修改类Operation,这是违背修改封闭原则的。

    简单工厂实现:

            Public Class Operation
                Private _numA As Double
                Private _numB As Double
                Public Property NumA As Double
                    Get
                        Return _numA
                    End Get
                    Set(ByVal value As Double)
                        _numA = value
                    End Set
                End Property
                Public Property NumB As Double
                    Get
                        Return _numB
                    End Get
                    Set(ByVal value As Double)
                        _numB = value
                    End Set
                End Property
                Public Overridable Function GetResult()
                    Dim result = 0
                    Return result
                End Function
    
            End Class
    
            Public Class AddOperation
                Inherits Operation
    
                Public Overrides Function GetResult() As Object
                    Return Me.NumA + Me.NumB
                End Function
            End Class
    
            Public Class SubOperation
                Inherits Operation
    
                Public Overrides Function GetResult() As Object
                    Return Me.NumA - Me.NumB
                End Function
            End Class
    
            Public Class MulOperation
                Inherits Operation
    
                Public Overrides Function GetResult() As Object
                    Return Me.NumA * Me.NumB
                End Function
            End Class
    
            Public Class OperationFactory
                Public Shared Function CreateOperation(ByVal op As String) As Operation
                    Dim operation As Operation = Nothing
                    Select Case op
                        Case "+"
                            operation = New AddOperation
                        Case "-"
                            operation = New SubOperation
                        Case "*"
                            operation = New MulOperation
                        Case Else
                            Throw New Exception("操作参数不对")
                    End Select
                    Return operation
                End Function
            End Class
    

    这样一来,要扩展新的功能,只需要添加Operation的子类即可,而不必更改已有代码。惟独不舒服的是,要在工厂类中添加Case,这产生了新的模式

    简单工厂模式+反射+配置文件,通过配置文件读取操作类型字符串,通过反射生成相应的操作子类实例。现在代码就相当的完美的。

  • 相关阅读:
    【剑指offer】对称的二叉树
    【剑指offer】数组中的逆序对
    【剑指offer】不用加减乘除做加法
    【剑指offer】和为S的连续正数序列
    【剑指offer】删除链表中重复的结点
    【剑指offer】平衡二叉树
    Math.ceil()、Math.floor()和Math.round()
    document.querySelectorAll遍历
    JS选择器querySelector和~All,三个原生选择器
    js 操作select和option常见用法
  • 原文地址:https://www.cnblogs.com/apiter/p/1851071.html
Copyright © 2011-2022 走看看