上次讲解了简单工厂模式与工厂方法模式的区别,这次又学习了一种抽象工厂模式,我觉得也可以跟他们进行联系起来。这次就来讲解抽象工厂模式与他们的区别。
上次说了从简单工厂模式到工厂方法模式的转换,这次看一下从工厂方法模式到抽象工厂模式的过渡。
抽象工厂模式:提供一个创建一系列相关或想相互依赖对象的接口而无需制定它们具体的类。与方法工厂模式非常的相似,只不过方法工厂模式只是限于一个产品族,而抽象工厂方法模式涉及到多个产品族。
举例:工厂方法模式:有两家公司同时生产轿车,在这里“轿车”就是“抽象产品类”,具体的产品就是“现在,丰田”。工厂抽象接口就是“公司”,具体的工厂就是“现在汽车集团,丰田汽车公司”。代码结构:
代码显示:
//轿车类
public class Car
{
public virtual void Show()
{
Console.WriteLine(" ");
}
//具体轿车类
class XiandaiCar:Car
{
public override void Show()
{
Console.WriteLine("在现在汽车集团制造现代牌轿车 ");
}
}
class FengtianCar : Car
{
public override void Show()
{
Console.WriteLine("在丰田汽车公司制造丰田牌轿车 ");
}
}
//公司接口
interface Company
{
Car CreateCar();
}
//现代汽车公司工厂
class XiandaiCompanyFactory:Company
{
public Car CreateCar()
{
return new XiandaiCar();
}
}
//丰田汽车公司工厂
class FengtianCompanyFactory:Company
{
public Car CreateCar()
{
return new FengtianCar();
}
}
客户端代码:
static void Main(string[] args)
{
Company company = new XiandaiCompanyFactory();
Car xd = company.CreateCar();
xd.Show();
Console.ReadLine();
}
结果显示:
抽象工厂模式举例:如果这两个公司不止生产轿车还生产货车,这时候就用抽象工厂模式。代码结构图:
代码显示:
//轿车类
public class Car
{
public virtual void Show()
{
Console.WriteLine(" ");
}
}
//货车类
public class Truck
{
public virtual void Show()
{
Console.WriteLine(" ");
}
}
//具体轿车类
class XiandaiCar:Car
{
public override void Show()
{
Console.WriteLine("在现在汽车集团制造现代牌轿车 ");
}
}
class FengtianCar : Car
{
public override void Show()
{
Console.WriteLine("在丰田汽车公司制造丰田牌轿车 ");
}
}
//具体货车类
class XiandaiTruck:Truck
{
public override void Show()
{
Console.WriteLine("在现在汽车集团制造现代牌货车 ");
}
}
class FengtianTruck : Truck
{
public override void Show()
{
Console.WriteLine("在丰田汽车公司制造丰田牌货车 ");
}
客户端代码:
static void Main(string[] args)
{
Company company = new XiandaiCompanyFactory();
Car xd = company.CreateCar();
Truck xdc = company.CreateTruck();
xd.Show();
xdc.Show();
Console.ReadLine();
}
结果显示:
从上例可以看出,抽象工厂模式比工厂方法模式多了一个产品族(货车),所以工厂方法模式用于生产一个产品族,而抽象工厂模式用于生产多个产品族(产品系列)的时候。
总结:抽象工厂模式:用于生产不用产品族(产品系列)的全部产品。对于增加新的产品不利于扩展,但是支持增加多个产品族。