1.目的
提供一个创建一系列相关或者相互依赖的对象的接口,而无需指定他们具体的类,产品簇的实现、流水线模式的实现(同一流水线上的零件是相互依赖的、跨流水线部件无法保证零件直接的连接)。可以从抽象工厂继承出实际的工厂、实际的流水线。在这些工厂或者流水线上的部件是同一个产品的不同部分,能充分保证零件间的可连接性。
2.整体实现
1.基于抽象类的抽象工厂的实现
//这里我们假设如下:铺了地毯的家庭,房门是木质的;铺了瓷砖的办公区域,房门是不锈钢的
//这样就实现了,同样是一间房子,那么所需要的组件是有依赖的,相互制约
public abstract class AbstractHomeFactory
{
//对于抽象工厂是使用抽象类、还是使用接口,网上很多例子都有,按照实际情况来选择
//接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
public abstract Door CreateDoor();
public abstract Floor CreateFloor();
//使用了抽象类来实现,可以添加一些公用函数的并在抽象类中实现,如果是接口的话
//需要在相应的实现类中自己实现
public void Describe()
{
Console.WriteLine(this.CreateDoor().Matrial);
Console.WriteLine(this.CreateFloor().Matrial);
}
//注意【1】抽象类的抽象方法必须是public的,否则实现类无法override
}
public class Door
{
public Door(string _matrial, double _heigh)
{
Matrial = _matrial;
Heigh = _heigh;
}
public string Matrial { get; set; }
public double Heigh { get; set; }
}
public class Floor
{
public Floor(string _matrial)
{
Matrial = _matrial;
}
public string Matrial { get; set; }
}
//抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系
// 而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”
//一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)
class SweetHomeFactory : AbstractHomeFactory
{
//实现类实现抽象类的方法,使用关键字override
public override Door CreateDoor()
{
return new Door("地毯",15);
}
public override Floor CreateFloor()
{
return new Floor("优质木材");
}
}
//在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
//抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分
//继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
class OfficeHomeFactory : AbstractHomeFactory
{
public override Door CreateDoor()
{
return new Door("不锈钢", 10);
}
public override Floor CreateFloor()
{
return new Floor("瓷砖");
}
}
static void Main(string[] args)
{
//实例化一个 实现了的抽象类的子类
AbstractHomeFactory facotry = new SweetHomeFactory();
facotry.Describe();
Console.ReadLine();
}
2.基于接口的抽象工厂的实现
略
3.思考
1.抽象工厂应该通过反射(配置)来确定实现类-实例化一个抽象工厂对象的子类
2.抽象工厂里面有很多的Model(实体),如何处理部分实体是公用的,二不是只用于一条产品线,并且做到合理配置呢
3.新增产品线该怎么处理?