假设有一个工厂,可以生产不同的产品,他们都有一个方法,就是生产,那么我们可以抽象出一个类
public abstract class Product
{
public abstract string MakeProduct();
}
{
public abstract string MakeProduct();
}
因为生产各个不同产品的工序不同,所以各自的MakeProduct方法也不同
public class ProductA : Product
{
public override string MakeProduct()
{
return "You has made a ProductA";
}
}
{
public override string MakeProduct()
{
return "You has made a ProductB";
}
}
{
public override string MakeProduct()
{
return "You has made a ProductC";
}
}
{
public override string MakeProduct()
{
return "You has made a ProductA";
}
}
public class ProductB : Product
{
public override string MakeProduct()
{
return "You has made a ProductB";
}
}
public class ProductC : Product
{
public override string MakeProduct()
{
return "You has made a ProductC";
}
}
现在有这样一个场景,这个工厂一天会生产一个产品,实现的代码很简单,例如今天生产A
ProductA objA = new ProductA()
objA.MakeProduct();
objA.MakeProduct();
但是明天这个厂又生产B了,我们就得修改代码,于是就需要有一个类,根据配置来生成不同的实体。
public class SimplyFactory
{
private SimplyFactory()
{ }
{
switch (productType.ToUpper())
{
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
throw new Exception("We don't have this product line");
}
}
}
{
private SimplyFactory()
{ }
public static Product GetInstance(string productType)
{
switch (productType.ToUpper())
{
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
throw new Exception("We don't have this product line");
}
}
}
这样我们就能不修改任何代码,只修改配置文件,就可以生产不同的产品了
Product product = SimplyFactory.GetInstance("B");
string strProductResult = product.MakeProduct();
string strProductResult = product.MakeProduct();
MessageBox.Show(strProductResult);
总结一下简单工厂模式适合的场景:
- 一批对象,具有相同的行为
- 外部只用关心这一行为,而不用关心这一行为的具体实现
- 通过配置,可以控制这一行为
在看一下实际开发中常常会用到简单工厂的地方:
- 数据库连接
我们可能会连到不同的数据源,如:SQLServer,Oracle等,他们都有Open和Close行为,我们需要通过配置来决定到底使用哪个连接,这时可使用简单工厂。 - FTP/SFTP切换
同样都有共同行为upload,download,需要通过配置决定到底使用哪个方法,这时也可使用简单工厂