C#设计模式系列:工厂方法模式(Factory Method) 联系客服

发布时间 : 星期三 文章C#设计模式系列:工厂方法模式(Factory Method)更新完毕开始阅读faa5faa3bb0d4a7302768e9951e79b89680268cf

C#设计模式系列:工厂方法模式(Factory Method)

1. 工厂方法模式简介

1. 工厂方法模式简介1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式是以一个类的实例化延迟到其子类。 Factory Method模式用于在不指定待创建对象的具体类的情况下创建对象。 Factory Method模式的主要意图是隐藏对象创建的复杂性。Client通常不指定要创建的具体类,Client将面向接口或抽象类进行编码,让Factory类负责创建具体的类型。通常Factory类有一个返回抽象类或者接口的静态方法。Client通常提供某种信息让Factory类使用提供的信息来确定创建并返回哪个子类。 将创建子类的责任抽象出来的好处是允许Client完全无需考虑依赖类是如何创建的,这遵守依赖倒置原则(Dependency Inversion Principle,DIP)。Factory Method模式另外一个好处是把负责对象创建的代码集中起来,如果需要修改对象生成方式,可以轻松定位并更新,而不会影响到依赖它的代码。 在面向对象编程中,一般方法是用一个new操作符产生一个对象的实例。但是在一些情况下,用new操作符直接生成对象会带来一些问题。首先,要使用new运算符创建一个对象必须清楚所要创建的对象的类信息,包括类名、构造函数等,而有时并不

现实。其次许多类型的对象创建需要一系列的步骤,可能需要计算或取得对象的初始设置,选择生成那个子对象实例,或在生成需要的对象之前必须生成一些辅助功能的对象。在这些情况下,新对象的建立就是一个过程,而不是一个简单的操作。为轻松方便地完成复杂对象的创建,从而引入了工厂模式。1.2 使用频率 高2. 工厂方法模式结构2.1 结构图2.2 参与者 工厂方法模式参与者: Product:Product角色,定义工厂方法所创建的对象的接口 ConcreteProduct:具体Product角色,实现Product接口 Factory ° 抽象的工厂角色,声明工厂方法,该方法返回一个Product类型的对象 ° Factory可以定义一个工厂方法的默认实现,返回一个默认的ConcreteProduct对象。可以调用工厂方法以创建一个Product对象。 ConcreteFactory:具体的工厂角色,创建具体Product的子工厂,重写工厂方法以返回一个ConcreteProduct实例3. 工厂方法模式结构实现 Product.csusing System; using System.Collections.Generic; using System.Linq;

using System.Text;namespace

DesignPatterns.FactoryMethodPattern.Structural {

/// <summary>

/// 定义Product抽象类,Client调用Product抽象类,并由Factory来创建具体类。 /// </summary>

public abstract class Product { }

} ConcreteProductA.csusing System; using System.Collections.Generic; using System.Linq;

using System.Text;namespace

DesignPatterns.FactoryMethodPattern.Structural {

public class ConcreteProductA : Product { }

} ConcreteProductB.csusing System; using System.Collections.Generic; using System.Linq;

using System.Text;namespace

DesignPatterns.FactoryMethodPattern.Structural {

public class ConcreteProductB : Product

{ }

} Factory.csusing System; using System.Collections.Generic; using System.Linq;

using System.Text;namespace

DesignPatterns.FactoryMethodPattern.Structural {

public abstract class Factory {

public abstract Product CreateProduct(); }

} ConcreteFactoryA.csusing System; using System.Collections.Generic; using System.Linq;

using System.Text;namespace

DesignPatterns.FactoryMethodPattern.Structural {

public class ConcreteFactoryA : Factory {

public override Product CreateProduct() {