一、抽象工厂的概念:
抽象工厂模式是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
在上一篇中介绍了工厂方法模式(https://blog.youkuaiyun.com/Jie_Studio/article/details/88970736),工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本篇所要介绍的内容。
同样,还是根据上个案例一样,做了一个简单的修改:
1.先定义两个具体产品的抽象类:
/// <summary>
/// 牛奶的抽象类,可以供地方继承
/// </summary>
public abstract class Milk
{
// 输出方法
public abstract void Print();
}
/// <summary>
/// 果汁的抽象类,可以供地方继承
/// </summary>
public abstract class Juice
{
// 输出方法
public abstract void Print();
}
2.创建地方类继承产品类:
/// <summary>
/// 上海的牛奶类
/// </summary>
public class ShangHaiMilk : Milk
{
public override void Print()
{
Console.WriteLine("一瓶上海牛奶!");
}
}
/// <summary>
/// 上海的果汁类
/// </summary>
public class ShangHaiJuice : Juice
{
public override void Print()
{
Console.WriteLine("一瓶上海果汁!");
}
}
/// <summary>
/// 北京的牛奶类
/// </summary>
public class BeiJingMilk : Milk
{
public override void Print()
{
Console.WriteLine("一瓶北京牛奶!");
}
}
/// <summary>
/// 北京的果汁类
/// </summary>
public class BeiJingJuice : Juice
{
public override void Print()
{
Console.WriteLine("一瓶北京果汁!");
}
}
3.定义一个抽象工厂类,提供创建两个不同地方的牛奶和果汁的接口
/// <summary>
/// 抽象工厂类,提供创建两个不同地方的牛奶和果汁的接口
/// </summary>
public abstract class AbstractFactory
{
//牛奶接口
public abstract Milk CreateMilk();
//果汁接口
public abstract Juice CreateJuice();
}
4.创建地区工厂继承抽象工厂类:
/// <summary>
/// 上海工厂负责出售上海的牛奶和果汁
/// </summary>
public class ShangHaiFactory : AbstractFactory
{
public override Juice CreateJuice()
{
return new ShangHaiJuice();
}
public override Milk CreateMilk()
{
return new ShangHaiMilk();
}
}
/// <summary>
/// 北京工厂负责出售北京的牛奶和果汁
/// </summary>
public class BeiJingFactory : AbstractFactory
{
public override Juice CreateJuice()
{
return new BeiJingJuice();
}
public override Milk CreateMilk()
{
return new BeiJingMilk();
}
}
优点:抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展。
以上,就是我个人对抽象工厂模式的理解;如果有不足的地方,希望可以指正;