简单工厂模式并不属于GoF的23中设计模式,但是它是学习其他工厂模式的基础和前提条件。理解了简单工厂模式,学习工厂方法模式和抽象工厂模式会比较容易一些。
简单工厂模式的定义
定义一个工厂类,他可以根据不同的参数返回不同类的实例。通常情况下,被创建的类的实例通常都具有共同的父类。
简单工厂模式又可以称之为静态工厂方法模式,因为创建对象实例的方法通常都是静态方法。
在简单工厂模式中,只需要记住一点。一个简单的参数可以即可获得所需的对象实例。
简单工厂模式的UML图如下:
简单工厂模式包含三个角色:
1.工厂角色(Factory):该类是简单工厂的核心,我们所需要的对象实例就是这个类帮我们创建的,它里面有一个静态方法GetProduct(string productType),我们通过传入产品类型(productType)来得到我们想要的产品。
2.抽象产品角色(AbstractProduct):该类是所有产品的父类。它可以是接口或者抽象类。只有这样我们才能给工厂的GetProduct(string productType)方法定义返回值。
3.实体产品(ConcreteProductA,ConcreteProductB,ConcreteProductC):这些类是简单工厂最终要创建的目标,也是客户端最终想要的对象实例。
接下来看一下代码的实现:
首先是我们的AbstractProduct(抽象产品): 我这里把它设计为接口
public interface AbstractProduct
{
}
然后使我们的三个ConcreteProduct(实体产品)类 注意他们实现了AbstractProduct接口
public class ConcretProductA:AbstractProduct
{
}
public class ConcretProductB:AbstractProduct
{
}
public class ConcretProductC:AbstractProduct
{
}
最后是我们的简单工厂类:
public static class Factory
{
public static AbstractProduct GteProduct(string productType)
{
AbstractProduct product = null;
switch (productType)
{
case "A":
product = new ConcretProductA();//返回实体产品A
break;
case "B":
product = new ConcretProductB();//返回实体产品B
break;
case "C":
product = new ConcretProductC();//返回实体产品C
break;
}
return product;
}
}
最后在客户端我们可以通过简单工厂的静态方法去创建我们所需要的实体产品类型,假如说我想要ConcreteProductA类的实例,代码如下:
AbstractProduct product = StaticFactory.GteProduct("A");//返回A产品
//.....调用product的方法,此处省略
到这里简单工厂模式基本上就给大家介绍完了。其核心非常简单,客户端想要什么实体产品,就把这种产品的参数传给工厂,然后工厂根据传进来的参数创建对应的实体产品返回给客户端(注意返回类型是所有实体产品的父类或者一个接口)
接下来进一步升级和优化我们的代码。
试想一下,在上面的客户端代码中,我创建了ConcreteProductA,但是如果我想要ConcreteProductB呢?我们就必须修改源代码了,把GeProduct(string productType)的参数改为B。这违背了前面所说的设计原则里面的开闭原则(不理解开闭原则请参考C#设计模式前奏-面向对象设计原则)。那么怎么解决这个问题呢?答案是把productType存储在配置文件中,然后在客户端读取配置文件,获取实体产品类型,再让简单工厂去创建我们想要的实体产品。以后如果想变换实体产品类型,只需修改配置文件即可。
请看以下配置文件的代码和客户端的代码:
<appSettings>
<add key="productType" value="A"/>
</appSettings>
static string productType = ConfigurationManager.AppSettings["productType"];
AbstractProduct product = StaticFactory.GteProduct(productType);//返回A产品
//.....调用product的方法,此处省略
最后在介绍一个简化后的简单工厂
有时候我们能为了简化代码,会把简单工厂类和抽象产品类合并为一个类(这时候抽象产品就不能是接口了),把静态工厂方法移到抽象产品中去(注意实体产品都继承了这个抽象产品), 请看以下代码
public class AbstratProduct//这是我们的抽象产品类
{
//这是我们的静态工厂方法
public static AbstractProduct GteProduct(string productType)
{
AbstractProduct product = null;
switch (productType)
{
case "A":
product = new ConcretProductA();//返回实体产品A
break;
case "B":
product = new ConcretProductB();//返回实体产品B
break;
case "C":
product = new ConcretProductC();//返回实体产品C
break;
}
return product;
}
}
最后给大家介绍一个和技术相关的付费问答平台、阅读平台-技易 欢迎访问:http://www.seekwd.com
欢迎关注官方微信号:
下一篇总将给大家讲解工厂方法模式