借鉴各路大神的博客,也就不做链接了
class FactoryPattern
{
//玄幻小说里面有一种类型的门派可以屹立于万千门派之中,特殊职业(炼丹造器画阵...)
public abstract class 丹药
{
public abstract void 生产过程();
}
public class 补血丹 : 丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗补血丹");
}
}
public class 补气丹 : 丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗补气丹");
}
}
//当我需要 补血丹 的时候就 New(实例化)一个 补血丹类
//当我需要 补气丹 的时候就 New(实例化)一个 补气丹类
//当我需要 补**丹 的时候就 New(实例化)一个 补**丹类
//如果有一百个地方需要丹药就要去实例化一百次,一旦丹药除了问题改了一点点,岂不是要找到这一百个地方作修改
//由此可使用简单工厂模式
//定义一个工厂类来专门实例化这些丹药类,就算错了我也只改工厂类这边
public class 炼丹房
{
public static 丹药 生产丹药(string type)
{
丹药 result;
switch (type)
{
case "补血丹":
result = new 补血丹();
break;
case "补气丹":
result = new 补气丹();
break;
//case "补魂丹":
// result = new 补魂丹();
// break;
default:
result = null;
break;
}
return result;
}
}
//SimpleFactoryPattern.丹药 ss = SimpleFactoryPattern.炼丹房.生产丹药("补血丹");
//ss.生产过程();
//通过这种方式调用就不用每个地方都去实例化
//那么问题来了,现在我拿到了一个新的单方,补魂丹
public class 补魂丹 : 丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗补魂丹");
}
}
//这样是不是表示我要去工厂类的静态方法的switch语句中加一种补魂丹的实例化(上面注释掉的部分)
//本来这样做没什么,无非就是扩展(篡改)了别人的工厂类
//由此,我们使用工厂方法模式,扩展丹药工厂
//首先抽象出一个工厂类
public abstract class 总炼丹房
{
public abstract 丹药 生产丹药();
}
//每种丹药一个单独的工厂
public class 补血丹炼丹房 : 总炼丹房
{
public override 丹药 生产丹药()
{
return new 补血丹();
}
}
public class 补气丹炼丹房 : 总炼丹房
{
public override 丹药 生产丹药()
{
return new 补气丹();
}
}
/*
* //FactoryPattern.总炼丹房 s = new FactoryPattern.补血丹炼丹房();
* //FactoryPattern.总炼丹房 s = new FactoryPattern.补魂丹炼丹房();
* FactoryPattern.总炼丹房 s = new FactoryPattern.补气丹炼丹房();
* FactoryPattern.丹药 ss = s.生产丹药();
* ss.生产过程();
* 调用
*/
//现在我拿到补魂丹,也可单独弄个工厂生产补魂丹
//再加多少个单方都可以扩展
public class 补魂丹炼丹房 : 总炼丹房
{
public override 丹药 生产丹药()
{
return new 补魂丹();
}
}
//那么问题又来了,以上说的补血丹都是一品的,现在我升级了,需要二品的丹药才能满足
//那么抽象工厂模式就来了
//那么丹药就应该分成有品级的
public abstract class 丹宗
{
public abstract 一品丹药 生产一品丹药();
public abstract 二品丹药 生产二品丹药();
}
public abstract class 一品丹药
{
public abstract void 生产过程();
}
public class 一品补血丹 : 一品丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗一品补血丹");
}
}
public class 一品补气丹 : 一品丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗一品补气丹");
}
}
public abstract class 二品丹药
{
public abstract void 生产过程();
}
public class 二品补血丹 : 二品丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗二品补血丹");
}
}
public class 二品补气丹 : 二品丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗二品补气丹");
}
}
public class 新补血丹炼丹房 : 丹宗
{
public override 一品丹药 生产一品丹药()
{
return new 一品补血丹();
}
public override 二品丹药 生产二品丹药()
{
return new 二品补血丹();
}
}
public class 新补气丹炼丹房 : 丹宗
{
public override 一品丹药 生产一品丹药()
{
return new 一品补气丹();
}
public override 二品丹药 生产二品丹药()
{
return new 二品补气丹();
}
}
//现在我拿到补魂丹单方
public class 一品补魂丹 : 一品丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗一品补魂丹");
}
}
public class 二品补魂丹 : 二品丹药
{
public override void 生产过程()
{
Console.WriteLine("生产出一颗二品补魂丹");
}
}
public class 新补魂丹炼丹房 : 丹宗
{
public override 一品丹药 生产一品丹药()
{
return new 一品补魂丹();
}
public override 二品丹药 生产二品丹药()
{
return new 二品补魂丹();
}
}
/*
* //FactoryPattern.丹宗 s = new FactoryPattern.新补血丹炼丹房();
* FactoryPattern.丹宗 s = new FactoryPattern.新补气丹炼丹房();
* //FactoryPattern.丹宗 s = new FactoryPattern.新补魂丹炼丹房();
*
* FactoryPattern.一品丹药 ss = s.生产一品丹药();
* //FactoryPattern.二品丹药 ss = s.生产二品丹药();
*
* ss.生产过程();
* 调用
*/
//我以上说都是以 单方 变化来解释,你也可以以品级来作为变化值,实际项目中也是一样,选择一个可控的变化值
//比如:品级变化,那么丹宗类下面的将不再是一品丹药二品丹药而是不变的补血丹和补气丹,变化的是品级,扩展的也会是品级
//小学语文,海涵
}