工厂方法(Factory Method)
工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化那一个类。Factory Method使一个类的实例化延迟到子类。
别名虚构造器(Virtual Constructor)
结构
代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod { public abstract class Product { public abstract void Operation(); } public class ConcreteProductA : Product { public override void Operation() { Console.WriteLine("ConreteProduct A"); } } public class ConcreteProductB : Product { public override void Operation() { Console.WriteLine("ConreteProduct B"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod { public abstract class Creater { public abstract Product FactoryMethod(); } public class ConcreteCreatorA : Creater { public override Product FactoryMethod() { return new ConcreteProductA(); } } public class ConcreteCreatorB : Creater { public override Product FactoryMethod() { return new ConcreteProductB(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod { class Program { static void Main(string[] args) { Creater c; Product p; c = new ConcreteCreatorA(); p = c.FactoryMethod(); p.Operation(); Console.WriteLine(); c = new ConcreteCreatorB(); p = c.FactoryMethod(); p.Operation(); Console.ReadKey(); } } }
效果
1)工厂方法不再将与特定应用有关的类绑定到你的代码中 代码仅处理Product接口;因此它可以与用户定义的任何ConcreteProduct类一起使用。简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实例化产品类,选择判断的问题还是存在的,也就是说工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
实现参考代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod1 { 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; } } public class OperationAdd : Operation { public override double GetResult() { return NumberA + NumberB; } } class OperationSub : Operation { public override double GetResult() { return NumberA - NumberB; } } class OperationMul : Operation { public override double GetResult() { return NumberA * NumberB; } } class OperationDiv : Operation { public override double GetResult() { if (NumberB == 0) { throw new Exception("Divisor cannot be zero"); } return NumberA / NumberB; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod1 { // 简单工厂实现 class SimpleFactory { public static Operation createOperation(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; default: break; } return oper; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod1 { // 工厂方法实现 interface IFactory { Operation CreateOperation(); } public class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } } class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } } class MulFactory : IFactory { public Operation CreateOperation() { return (Operation)new OperationMul(); } } class DivFactory : IFactory { public Operation CreateOperation() { return new OperationDiv(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyFactoryMethod1 { class Program { static void Main(string[] args) { // 简单工厂 Operation oper1 = SimpleFactory.createOperation("+"); oper1.NumberA = 1; oper1.NumberB = 2; double result1 = oper1.GetResult(); Console.WriteLine("result2:{0}", result1); // 工厂方法 IFactory opFactory = new AddFactory(); // 实例化工厂(子类) Operation oper2 = opFactory.CreateOperation(); // 工厂方法 oper2.NumberA = 2; oper2.NumberB = 3; double result2 = oper2.GetResult(); Console.WriteLine("result2:{0}", result2); Console.ReadKey(); } } }预告
抽象工厂(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。