工厂方法模式
一个工厂只能创建一种产品
工厂方法模式的结构
工厂方法模式包含以下4个角色
Product(抽象产品)
ConcreteProduct(具体产品)
Factory(抽象工厂)
ConcreteFactory(具体工厂)
模式缺点
- 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
- 增加了系统的抽象性和理解难度
- 一个具体工厂只能创建一种具体产品/如果我们想更换另外一种产品,仍然需要修改具体的工厂类
模式适用环境
- 客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)
- 抽象工厂类通过其子类来指定创建哪个对象
代码示例
Program
namespace 工厂模式
{
internal class Program
{
static void Main(string[] arg)
{
IFactory factory = new TVFactroy();
factory.ManfactureProduct().ShowInfo();
//创建工厂
IFactory factory1 = new WaterFactroy();
factory1.ManfactureProduct().ShowInfo();
}
}
}
工厂基类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂模式
{
/// <summary>
/// 抽象工厂基类
/// </summary>
public abstract class IFactory
{
//生产产品
public abstract IProduct ManfactureProduct();
}
}
产品基类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂模式
{
/// <summary>
/// 抽象产品类
/// </summary>
public abstract class IProduct
{
public string Name { get; set; }//产品名称
public abstract void ShowInfo();//展示产品信息
}
}
具体电视工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂模式
{
public class TVFactroy : IFactory
{
public override IProduct ManfactureProduct()
{
return new TVProduct("龙江彩电");
}
}
}
具体水工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂模式
{
internal class WaterFactroy: IFactory
{
public override IProduct ManfactureProduct()
{
return new WahingMachineProduck("龙江水");
}
}
}
水工厂里生产的产品
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂模式
{
public class WahingMachineProduck : IProduct
{
public WahingMachineProduck(string name)
{
Name = name;
}
public override void ShowInfo()
{
Console.WriteLine($"一台{Name}被生产出来了");
}
}
}
电视工厂中生产的产品
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂模式
{
public class TVProduct : IProduct
{
public TVProduct(string name)
{
Name = name;
}
public override void ShowInfo()
{
Console.WriteLine($"一台{Name}被生产出来了");
}
}
}
抽象工厂模式
一个工厂可以生产多个产品
抽象工厂方法模式的结构
抽象工厂模式包含以下4个角色:
•
AbstractFactory
(抽象工厂)
•
ConcreteFactory
(具体工厂)
•
AbstractProduct
(抽象产品)
•
ConcreteProduct
(具体产品)
代码示例
namespace _008_抽象工厂
{
/// <summary>
/// 抽象工厂
/// </summary>
public abstract class AbstractFactory
{
public abstract AbstractProductTV CreateProductTV();//电视机生产线
public abstract AbstractProductIceBox CreateProductIceBox();//冰盒子生产线
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 冰盒子基类__抽象产品B
/// </summary>
public abstract class AbstractProductIceBox
{
public string Name { get; set; }//产品名称
public abstract void ShowInfo();//展示产品信息
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 电视机基类__抽象产品A
/// </summary>
public abstract class AbstractProductTV
{
public string Name { get; set; }//产品名称
public abstract void ShowInfo();//展示产品信息
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 海尔冰箱_具体产品B1
/// </summary>
public class HaiErBox : AbstractProductIceBox
{
public override void ShowInfo()
{
Name = "海尔冰箱";
Console.WriteLine($"一台{Name}被生产出来了");
}
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 美的冰箱_具体产品B2
/// </summary>
public class MeiDiBox : AbstractProductIceBox
{
public override void ShowInfo()
{
Name = "美的冰箱";
Console.WriteLine($"一台{Name}被生产出来了");
}
}
}
namespace _008_抽象工厂
{
public class HaiErTV : AbstractProductTV
{/// <summary>
/// 海尔电视_具体产品A1
/// </summary>
public override void ShowInfo()
{
Name = "海尔电视";
Console.WriteLine($"一台{Name}被生产出来了");
}
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 美的电视_具体产品A2
/// </summary>
public class MeiDiTV:AbstractProductTV
{
public override void ShowInfo()
{
Name = "美的电视";
Console.WriteLine($"一台{Name}被生产出来了");
}
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 美的工厂__具体工厂
/// </summary>
public class MeiDiFactory : AbstractFactory
{
public override AbstractProductIceBox CreateProductIceBox()
{
return new MeiDiBox();
}
public override AbstractProductTV CreateProductTV()
{
return new MeiDiTV();
}
}
}
namespace _008_抽象工厂
{
/// <summary>
/// 海尔工厂__具体工厂
/// </summary>
public class HaiErFactory : AbstractFactory
{
public override AbstractProductTV CreateProductTV()
{
return new HaiErTV();
}
public override AbstractProductIceBox CreateProductIceBox()
{
return new HaiErBox();
}
}
}
调用
namespace _008_抽象工厂
{
internal class Program
{
static void Main(string[] args)
{
AbstractFactory factory=new HaiErFactory();
factory.CreateProductIceBox();
factory.CreateProductTV();
}
}
}