简单工厂Pk工厂方法

来源:互联网 发布:python random.choice 编辑:程序博客网 时间:2024/04/29 18:30

    工厂,顾名思义就是用来生产产品的地方。而在设计模式中提到的工厂是什么意思呢?设计模式中提到了三种工厂模式:简单工厂模式、抽象工厂模式、工厂方法模式,他们有什么共同点和区别呢?下边就来总结一下设计模式中的工厂家族


1 简单工厂模式


1.1定义:


简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。


1.2 UML类图




抽象产品:这里的抽象产品可以是抽象类也可以是接口

具体产品:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

工厂角色:这是简单工厂的核心部分,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。


1.3 UML实例





首先写出运算类(这是一个抽象类),他有两个Number属性,有一个GetResult的虚方法,用于得到结果。加减乘除是它的子类,继承他后,重写GetResult方法(因为是抽象类只提供虚方法,每个子类的方法各部不相同,所以需要对继承父类的方法进行重写)。而简单工厂的作用是:作为一个单独的类去实现子类的实例化过程。


运算类:

  class Operation  //运算类    {        private double _numberA = 0;        private double _numberB = 0;        public double NumberA        {            get { return _numberA; }            set { _numberA = value; }        }        public double NumberB        {             get { return _numberB; }            set { _numberB= value; }        }                public virtual double GetResult()  //vitual 用来声明虚方法,可被子类重写        {            double result=0;            return result;        }

加法类(其余三个雷同,省略)

class OperationAdd:Operation //加法类    {        public override double GetResult() //对父类方法进行重写        {            double result = 0;            result = NumberA + NumberB;            return result;        }    }

简单工厂类:

class OperationFactory    {         public static Operation createOperate(string operate)  // createOperate是静态方法,返回值是Operation,不需要实例化对象就可以使用        {            Operation oper = null;            switch (operate )            {                case "+":                    oper = new OperationAdd();                    break;                case "-":                    oper = new OperationSub();                    break;                case "*":                    oper = new OperationMul();                    break;                case"/":                    oper = new OperationDiv();                    break;            }            return oper;        }    }

客户端

 Operation oper;            oper = OperationFactory.createOperate("-");            oper.NumberA = 1;            oper.NumberB = 3;            double result = oper.GetResult();


1.4 应用场景


工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。(来自百科)

1.5 自己的理解


    简单工厂就是给他传进去原材料,他就可以生产出客户需要的产品,而客户并不需要知道这个产品是如何生产的。例如去餐厅点餐,餐厅就相当于是一个简单工厂,食品看做抽象类,宫保鸡丁,鱼香肉丝等等是具体的产品,你要什么,他就会生产出什么,而你不需要知道他是怎么做出来的。

总结一句话:简单工厂将消费者与建造者分离,有利于系统的优化。但是因为只有一个工厂类,所有的逻辑判断都集中在在这一个类中,如果他不能正常工作就会影响到客户端。



2 工厂方法


2.1定义


定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个实例化延迟到子类


2.2 UML图





2.3 UML实例


工厂接口:

 interface IFactory    {        Operation CreateOpertation(); //唯一的一个方法就是创建产品对应的工厂类    }


具体工厂类:(加法:其他雷同就不贴了)

class AddFactory:IFactory     {        public Operation CreateOperation() //加法类工厂,去实现IFactory接口        {            return new OperationAdd();        }    }


客户端:

 IFactory operFactory = new AddFactory();            Operation oper = operFactory.CreateOpertation();            oper.NumberA = 1;            oper.NumberB = 2;            double result = oper.GetResult();


2.4 应用场景

A:对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。

B:只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。(来自百科)


2.5 自己的理解


     工厂方法是简单工厂进一步的抽象,把工厂类抽象成一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。所有要生产具体类的工厂,就去实现这个接口。原来简单工厂只是对产品抽象出一个产品类,让具体产品去继承,现在我们把工厂类也进行了抽象,派生出多个具体的工厂类,这样在增加功能使,就不会对原来的工厂类直接进行修改,而是扩展出一个新的工厂子类。



简单工厂和工厂方法的对比



简单工厂:
优点:工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。那计算器举例,如果要你要算1+1等于几,那么只要把“+”传递给工厂,工厂就能实例化出你想要的运算类,客户端只要去做运算就可以了。简单工厂模式的工厂类是静态的,无需再客户端实例化
缺点上述优点也恰恰是它的缺点,如果要加一个新的运算功能,那么首先要添加这个运算类的子类,还要修改工厂类,前者是对扩展的开放,但是后者是对修改的开放,因为所有的逻辑都是包含在这一个工厂类里的,所以说违背了开闭原则

工厂方法:
优点是简单工厂进一步的抽象和推广,将逻辑判断部分延伸到子类,这样一来就符合了开闭原则
缺点没增加一个产品类,就要添加一个新的工厂类,增加了代码量,使结构变得复杂



0 0
原创粉丝点击