前言
学习设计模式-工厂模式,解决了简单工厂模式的缺点。
定义
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
说明介绍
我们还那万达商场做例子,简单工厂模式中,我们把店家当作是我们的选择之一,我们在换一种角度思考。
万达商场中一开始店家没有入驻的时候,时空的,但是它预留了很多店家的位置,需要别人进行入驻操作。
这个状态,我们可以理解成工厂模式的一种实现。这
里万达提供的店家门面,相当于我们程序中的一个个接口信息,只不过这些接口是没有实现的。
具体要实现那些,我们要看那些店家入驻。
代码示例
/// <summary>
/// 万达抽象类
/// </summary>
public abstract class WanDa
{
// 用户进行的购买操作
public abstract void Buy();
}
/// <summary>
/// 购买食物
/// </summary>
public class BuyFood : WanDa
{
public override void Buy()
{
Console.WriteLine("购买食物");
}
}
/// <summary>
/// 购买衣服
/// </summary>
public class BuyClothes: WanDa
{
public override void Buy()
{
Console.WriteLine("购买衣服");
}
}
/// <summary>
/// 抽象工厂类 -工厂模式实现的重要类
/// </summary>
public abstract class Creator
{
// 工厂方法
public abstract WanDa BuySomeThing();
}
/// <summary>
/// 购买食物-工厂类
/// </summary>
public class BuyFoodFactory:Creator
{
/// <summary>
/// 负责购买食物的超市/或者店家
/// </summary>
/// <returns></returns>
public override Food BuySomeThing()
{
return new BuyFood();
}
}
/// <summary>
/// 购买衣服-工厂类
/// </summary>
public class BuyClothesFactory:Creator
{
/// <summary>
/// 负责创建购买衣服的店家
/// </summary>
/// <returns></returns>
public override Food BuySomeThing()
{
return new BuyClothes();
}
}
/// <summary>
/// 客户进入万达商场了
/// </summary>
static void Main(string[] args)
{
// 初始化购买食物,购买衣服的店家()
Creator buyFood = new BuyClothesFactory();
Creator buyClothes = new BuyClothesFactory();
// 开始购买食物
WanDa food = buyFood.BuySomeThing();
food.Buy();
//开始购买衣服
WanDa clothes= buyClothes.BuySomeThing();
clothes.Buy();
Console.Read();
}
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
例如:增加一个购买家具的店家,实现购买
而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:
/// <summary>
/// 购买家具
/// </summary>
public class BuyFurniture : WanDa
{
/// <summary>
/// 重写抽象类中的方法
/// </summary>
public override void Buy()
{
Console.WriteLine("肉末茄子好了");
}
}
/// <summary>
/// 购买家具工厂类,负责实现售卖家具的效果
/// </summary>
public class BuyFurnitureFactory : Creator
{
/// <summary>
/// 负责售卖家具
/// </summary>
/// <returns></returns>
public override Food BuySomeThing()
{
return new BuyFurniture ();
}
}
/// <summary>
/// 客户进入万达商场了
/// </summary>
static void Main(string[] args)
{
// 初始化购买食物,购买衣服的店家()
Creator buyFood = new BuyClothesFactory();
Creator buyClothes = new BuyClothesFactory();
Creator buyFurniture= new BuyFurnitureFactory();
// 开始购买食物
WanDa food = buyFood.BuySomeThing();
food.Buy();
//开始购买衣服
WanDa clothes= buyClothes.BuySomeThing();
clothes.Buy();
//开始购买家具
WanDa furniture= buyFurniture.BuySomeThing();
furniture.Buy();
Console.Read();
}
优缺点以及应用场景
优点:
工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。
简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
工厂方法模式完全满足OCP,即它有非常良好的扩展性
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,
使得系统中类的个数成倍增加,
在一定程度上增加了系统的复杂度,
同时也增加了系统具体类的依赖。
应用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
等。。。
常用于数据库调整,毕竟数据库种类会比较多每家公司选择的又都不一样,所以需要了解一下
尾语
工厂模式算是我们项目中常用的一种模式了,主要的应用场景也是数据库访问的地方,可以达到一种动态切换数据库访问的效果。实际应用频率还是比较高的,就算不切换,也会预留,方便后期扩展(手动机智)
文章参考:
C#设计模式(3)——工厂方法模式
工厂模式