简单工厂模式:定义一个Factory类,能够根据参数的不一样返回不一样类的实例,被建立的实例一般有共同的父类。设计模式
简单工厂模式:只须要一个Factory类。ide
简单工厂模式:又称为静态工厂模式(Static Factory Pattern),Factory类为静态类或包含静态方法。spa
简单工厂模式:不属于23种GOF设计模式。设计
简单工厂模式:实质是由一个工厂类根据传入的参数,动态决定应该建立哪个产品类实例。3d
中code
简单工厂模式参与者:对象
◊ Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中。blog
◊ ConcreteProduct:具体产品类,将须要建立的各类不一样产品对象的相关代码封装到具体产品类中。继承
◊ Factory:工厂类,提供一个工厂类用于建立各类产品,在工厂类中提供一个建立产品的工厂方法,该方法能够根据所传入参数的不一样建立不一样的具体产品对象。接口
◊ Client:客户端类,只需调用工厂类的工厂方法并传入相应的参数便可获得一个产品对象。
Product.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Structural { public abstract class Product { } }
ConcreteProduct.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Structural { public class ConcreteProduct : Product { } }
Factory.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Structural { public class Factory { /// <summary> /// 静态方法建立Product实例 /// </summary> public static Product CreateProduct() { return new ConcreteProduct(); } } }
Program.cs
using System; using System.Collections.Generic; using System.Text; using DesignPatterns.SimpleFactoryPattern.Structural; namespace DesignPatterns.SimpleFactoryPattern { class Program { static void Main(string[] args) { Product product = Factory.CreateProduct(); Console.WriteLine("Created {0}", product.GetType().Name); } } }
运行结果:
Created ConcreteProduct
请按任意键继续. . .
IProduct.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation { public interface IProduct { void Display(); } }
Product.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation { public class Product : IProduct { public void Display() { Console.WriteLine("DesignPatterns.SimpleFactoryPattern.Structural.Product"); } } }
Factory.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation { public class Factory { /// <summary> /// Factory返回IProduct的静态方法 /// </summary> /// <returns></returns> public static IProduct Create() { // 使用new直接建立接口的具体类 //return new DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation.Product(); // 经过映射建立接口的具体类 return (IProduct)Assembly.Load("DesignPatterns.SimpleFactoryPattern").CreateInstance("DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation.Product"); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation; namespace DesignPatterns.SimpleFactoryPattern { class Program { static void Main(string[] args) { IProduct product = Factory.Create(); product.Display(); } } }
Operation.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { /// <summary> /// 运算类 /// </summary> public abstract class Operation { public double NumberA { get; set; } public double NumberB { get; set; } public virtual double GetResult() { const double result = 0; return result; } } }
Plus.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { /// <summary> /// 加法运算 /// </summary> public class Plus : Operation { public override double GetResult() { return NumberA + NumberB; } } }
Minus.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { /// <summary> /// 减法运算 /// </summary> public class Minus : Operation { public override double GetResult() { return NumberA - NumberB; } } }
Multiply.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class Multiply : Operation { public override double GetResult() { return NumberA * NumberB; } } }
Divide.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class Divide :Operation { public override double GetResult() { return NumberA / NumberB; } } }
OperationFactory.cs
using System; using System.Collections.Generic; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class OperationFactory { public static Operation CreateOperate(string operate) { Operation operation = null; switch (operate) { case "+": operation = new Plus(); break; case "-": operation = new Minus(); break; case "*": operation = new Multiply(); break; case "/": operation = new Divide(); break; } return operation; } } }
Program.cs
using System; using System.Collections.Generic; using System.Text; using DesignPatterns.SimpleFactoryPattern.Practical; namespace DesignPatterns.SimpleFactoryPattern { class Program { static void Main(string[] args) { Operation operateion = OperationFactory.CreateOperate("+"); operateion.NumberA = 10; operateion.NumberB = 5; Console.WriteLine(operateion.GetResult()); } } }
IPayment.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public interface IPayment { bool Payfor(decimal money); } }
ABCPayment.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class ABCPayment : IPayment { public bool Payfor(decimal money) { // 调用中国农业银行支付接口进行支付 return true; } } }
ICBCPayment.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class ICBCPayment : IPayment { public bool Payfor(decimal money) { // 调用中国工商银行支付接口进行支付 return true; } } }
PaymentFactory.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class PaymentFactory { public static IPayment CreatePayment(string bank) { IPayment payment = null; switch (bank) { case "ABC": payment = new ABCPayment(); break; case "ICBC": payment = new ICBCPayment(); break; } return payment; } } }
OrderService.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical { public class OrderService { public bool CreateOrder(string bank) { decimal money=100m; var payment = PaymentFactory.CreatePayment(bank); return payment.Payfor(money); } } }
在OrderService类中,不依赖具体的支付类,只经过PaymentFactory来获取真正的支付类。
◊ 实现建立和使用分离;
◊ Client无需知道所建立的ConcreteProduct类名,只须要知道ConcreteProduct所对应的参数。
◊ Factory类集中全部ConcreteProduct的建立逻辑,职责太重。一旦须要添加新的ConcreteProduct,则须要修改Factory逻辑。这样违背了OCP(开放-关闭原则)。
◊ 因为使用了static方法,形成Factory没法造成基于继承的结构。