将类的实例化,推移到具体实现子类中实现【类图】
应用:对于产品族的维护,对于多种产
品族,方便维护产品族,产品类品种繁多。比如对于一个普通人拿着Gun,骑着摩托,抽着雪茄。
第二个兽人,拿着战斧,骑着战车,吃着肉。可以把这两个看成两个产品族。
角色划分:
抽象工厂角色:创建工厂类必须实现的接口
具体工厂角色:实现抽象工厂需要实现的接口
抽象产品角色:把具有共同属性的一类产品抽象出来一个超类,包含了应用程序密切相关的逻辑
具体产品角色:实现抽象产品角色定义的接口
那么我们解决方法:
第一步建立一个抽象工厂方法AbstractFactory类,该类与具体需要实现的逻辑没有关系。
public abstract class AbstractFactory
{
//里面定义了子类需要实现的接口
public abstract Food createfood();
public abstract Wepon createWepon();
public abstract Vehicle createVehicle();
}
第二步:分别对武器,座驾,食物进行抽象出来他们的父类那么我们可以建立这样的三个类
武器抽象类: public abstract class Wepon
{
//武器类都有能实现开火的功能
public abstract void fire();
}
座驾抽象类: public abstract class Vehicle
{
//座驾类需要都需要实现run的功能
public abstract void run();
}
实物抽象类:public abstract class Food
{
//获得食物名称的方法
public abstract void GetName();
}
第三部:
对于普通人的实体武器类,继承武器抽象类Wepon并实现里面的方法
public class Ak:Wepon
{
public override void fire()
{
Console.WriteLine("Ak47 GUN");
}
}
其他的一些方法都可以这样实现。具体的武器类都继承Wepon类,具体座驾类都继承Vehicle父类,具体食物类都继承Food类
第四部:
分别对不同的产品(种族)进行工厂方法进行实现。
对,普通人类继承抽象工厂类,这个普通人类中实现了抽象工厂AbstractFactory中需要实现的接口
class Nature:AbstractFactory
{
public override Food createfood()
{
return new Apple();
}
public override Vehicle createVehicle()
{
return new Car();
}
public override Wepon createWepon()
{
return new Ak();
}
}
这样也可以实现对兽人类 的实现。
第五步:
在主程序中调用抽象工厂方法实例化相应的产品族
class Program
{
static void Main(string[] args)
{
AbstractFactory af = new Nature(); //
af.createfood().GetName();
af.createVehicle().run();
af.createWepon().fire();
Console.ReadLine();
}
}
抽象工厂的可以方便的添加产品族。对很多产品类的维护简单,还可以把需要实现的产品类写入到配置文件中,这时我们就可以在
修改主程序的前提下完成对产品类进行修改。