定义
简单工厂模式:定义一个Factoryl类,可以根据参数的不同返回不同类的实例,被创建的实例通常都有共同的父类。又称为静态工厂模式,Factory类为静态类或包含静态方法。实质上是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。
参与者
Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中。
ConcreteProduct:具体产品类,将需要创建的各种不同产品对象的相关代码封装到具体产品类中。
Factory类:工厂类,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的方法,该方法可以根据所传入的参数的不同创建不同的具体产品对象
Client:客户端类,只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象
简单实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _7SimpleFactory
{
//客户端调用
class Program
{
static void Main(string[] args)
{
try
{
Drink kele = DrinkFactory.CreateDrink("可乐");
Drink xuebi = DrinkFactory.CreateDrink("雪碧");
Drink yibao = DrinkFactory.CreateDrink("怡宝");
if (kele != null)
{
Console.WriteLine(kele.ShowDrink());
}
if (xuebi != null)
{
Console.WriteLine(xuebi.ShowDrink());
}
if (yibao != null)
{
Console.WriteLine(yibao.ShowDrink());
}
}
catch (Exception ex)
{
Console.WriteLine("您输入有误:{0}",ex.Message);
}
}
}
//抽象产品类,定义抽象方法
public abstract class Drink
{
public abstract string ShowDrink();
}
//具体产品类
class kele : Drink
{
public override string ShowDrink()
{
return "我是可口可乐";
}
}
//具体产品类
class xuebi : Drink
{
public override string ShowDrink()
{
return "我是雪碧";
}
}
//具体产品类
class yibao : Drink
{
public override string ShowDrink()
{
return "我是怡宝";
}
}
//工厂类
public class DrinkFactory
{
public static Drink CreateDrink(string type)
{
Drink dir = null;
switch (type)
{
case "可乐": dir = new kele(); break;
case "雪碧": dir = new xuebi(); break;
case "怡宝": dir = new yibao(); break;
default: break;
}
return dir;
}
}
}
/*output:
我是可口可乐
我是雪碧
我是怡宝
*/
简单工厂模式的优缺点
优点:实现创建和使用分离。客户端不用知道所创建的具体产品类名,只需要知道具体产品类对应的参数。
缺点:Factory类中集中所有具体产品的创建逻辑,职责过重。一旦需要添加新的具体产品,则需要修改Factory逻辑。这样违背了开放-关闭原则。使用了静态方法,Factory类无法形成基于继承的结构。