简单工厂和工厂方法

来源:互联网 发布:淘宝服务商入驻流程 编辑:程序博客网 时间:2024/04/28 17:40

下面资料来自于网上,因为在本地时间有点久,当时也没有大家的链接,希望作者可以理解。

image

import Operation.Add;
import Operation.Div;
import Operation.Mul;
import Operation.Operation;
import Operation.Sub;

public class OperationFactory {
    public static Operation createOperation(char operate){  //这是静态的方法
        Operation operation=null;
        switch (operate) {
        case '+':
            operation=new Add();
            break;
        case '-':
            operation=new Sub();
            break;
        case '*':
            operation=new Mul();
            break;   
        case '/':
            operation=new Div();
            break;
        }
        return operation;
    }
}

import Operation.Operation;
public class Client {

    public static void main(String[] args) {

        //调用静态的工厂类的方法,用类名
        Operation operation = OperationFactory.createOperation('*');
        operation.setNumberA(12);
        operation.setNumberB(6);
        System.out.println(operation.operate());
    }
}

简单工厂模式最大的优点是:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

关联与依赖(聚合,组合)在代码中的体现

关联:

public class A{}
public class B {
   A a; //a是B类里的一个字段
}

类图:如图关联类图

注:组合与聚合是特殊的关联,他们是语义层次的关联。代码中体现不出他们与关联有什么差别。

依赖:

        public class A{}
        public class B {
          //在B中使用了A,但不是在字段中使用的
         void int funB1(A a){
               ...
          }
         A funB2(){
               ...
          }
}

类图:如图依赖类图

说完了简单工厂,这个时候,如果要增加求模的算法,这个时候,添加类求模的功能,然后修改简单工厂中的case语句。注意是“修改”,这违反了“开放封闭原则”。所以这个时候工厂方法登场了。

image

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。如上图所示,工厂方法的客户端需要决定实例化哪一个工厂来生产自己所需要的产品,判断逻辑仍然存在,仅仅是从简单工厂的内部逻辑判断移到了客户端代码进行逻辑判断。也就是说如果你要想最终生产出求模的功能,仍然需要修改代码,而只是这次修改的位置移到了客户端!

class Program
{
    static void Main(string[] args)
    {
        IFactory operFactory = new AddFactory(); //实例化加法工厂
        Operation oper = operFactory.CreateOperation();
        oper.NumberA = 1;
        oper.NumberB = 2;
        double result=oper.GetResult();

        Console.WriteLine(result);

        Console.Read();
    }
}

    工厂模式和简单工厂模式的代码对比下来有如下相同的地方:

  1.     所有的运算符都有其共同的基类;
  2.     有工厂类专门来生成各运算符类;
  3.     如果要新增一个运算符,仅就运算符类来说,只要从运算符基类再派生一个新运算符类即可实现;

      有以下不同的地方:

  1.     简单工厂模式只有一个工厂类进行运算符类实例化,而工厂模式的每一个运算符类有专门对应的工厂类;
  2.     简单工厂模式的运算符类的生成逻辑在工厂类中,客户端不用管要生成哪个类,而工厂模式的运算符类的生成逻辑必须要由客户端来处理;
  3. 新增一个运算符时,仅就工厂类来说,简单工厂模式要修改原有的工厂类,工厂模式则需要派生一个新的专门的工厂类;

      总结一下,简单工厂模式和工厂模式都是处理在不同的情况下需要创建不同类实例这样的问题的解决方式,区别如下:

  1.     面对新的需求时,简单工厂模式需要修改原有的类,而工厂模式只需要派生新的类,从而不破坏“开放-封闭原则”;
  2. 简单工厂模式的运算符类创建逻辑在工厂类中,客户端传入条件,工厂类负责根据条件来判断创建不同的运算符实例,客户端不管创建逻辑。而工厂方法中类实例的创建逻辑完全在客户端,由客户端根据需要先创建对应的专门工厂类,然后再创建对应的运算符类,比如我要创建加法运算符类,先由客户端创建加法工厂类,然后再由加法工厂类实例创建加法运算符类。
原创粉丝点击