C语言和设计模式之工厂模式家族
在工厂模式家族中最出名的是工厂三姐妹,根据抽象的程度不同分为简单工厂、工厂模式和抽象工厂模式。他们在我们平时的编程中会经常使用。所以我们应该详细地了解一下他们三者之间优缺点。
简单工厂定义简单工厂模式又叫做静态工厂方法(Static FactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
举例说明:
//客户端代码 static void Main(string[] args) { Operation oper; oper = OperationFactory.createOperate("*"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); } } //Operation运算类 public 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() { double result = 0; return result; } } //加减乘除类 class OperationAdd : Operation //加法类,继承运算类 { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } class OperationSub : Operation //减法类,继承运算类 { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } class OperationMul : Operation //乘法类,继承运算类 { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } class OperationDiv : Operation //除法类,继承运算类 { public override double GetResult() { double result = 0; if (NumberB == 0) throw new Exception("除数不能为0。"); result = NumberA / NumberB; return result; } } //简单运算工厂类 class OperationFactory { public static Operation createOperate(string operate) { 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; } }
1、工厂类是整个模式的关键.包含了必要的逻辑判断,根据给定的信息,决定究竟应该创建哪个具体类的实例。
2、明确了各自的职责和权利,有利于整个软件体系结构的优化。
简单工厂的缺点:1、由于工厂类集中了所有实例的创建逻辑,违反了高内聚低耦合原则,将全部创建逻辑集中到了一个工厂类中;
2、它所能创建的类只能是事先考虑到的,每次扩展都需要更改工厂类,违反了开放封闭原则。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。
工厂模式定义:用于创建对象的接口,让子类决定实例化哪一个类。工厂模式对类的实例化延迟到其子类。
举例说明:数据访问程序 代码实现:2、使用了多态性,保持了简单工厂的优点。
3、降低耦合度。降低了客户程序与产品对象的耦合。
抽象工厂定义: 创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
举例说明:数据访问程序代码实现:
对于增加需求,扩展程序时,需要增加许多子类,使得程序变得臃肿,麻烦。(此时可以利用放射+抽象工厂的方法避免)。总结:无论是简单工厂模式,工厂模式,还是抽象工厂模式,他们都属于工厂模式,并且是创建型模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。