抽象工厂模式

我们的工厂在工厂方法模式的改进下,现在可以生产各种各样的车了,你要啥车,你只要提供你的生产线,拿到我这里,我就能给你生产。

有一天,突然,我买的车爆胎了。这可咱办?换胎呗,但是备胎没有啊?别的太按上不能跑啊,怎么办?于是我们想到了,在生产车的时候,同样的生产一个备胎,供这个车使用。这样,即使开车的时候,爆胎了也不怕,我们换上备胎不就可以了。

抽象工厂模式与工厂方法模式很像,不同在于:工厂方法模式只能生产一种产品,如只能产车。而抽象工厂则不同,抽象工厂能生产多种类产品,如车和备胎。备胎和车是存在关联的两个对象。因此当我们需要产生两个相关的对象时,我们可以使用抽象工厂模式。

我们对工厂方法中提及的例子进行扩展。抽象出两个对象:车、备胎。然后定义一个工厂,这个工厂同时提供生产这两种产品的生产线的地方。假如此时我们要生产宝马车,我们要使用这个工厂,则必须提供能匹配这个工厂“车”和“备胎”的两条生产线。梳理下,也就是:

工厂(车、备胎)<------宝马车工厂(宝马车、宝马车备胎)。通过分析,我们知道,需要生产几种产品,则需要几个抽象的接口,然后有个抽象的工厂来调用这些产品的接口,并不关心这些接口产生何种对象。然后,具体的你要生产宝马,就自己构造自己的生产线(包含造车、造备胎)。具体实现可以看一下代码(C#):

/*
*---------------------------------
*| All rights reserved.
*| author: lizhanping
*| version:1.0
*| File: AbstractFactory.cs
*| Summary:
*| Date: 2019/3/9 13:29:52
*---------------------------------
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatternTest.AbstractFactory
{
//抽象工厂,为一组相关的产品族提供实例化的接口
//本例子中就包含 车 和 备胎 两个系列的产品,不同的车需要不同的备胎
//因此我们在工厂生产车的时候,需要一块将车生产出来
/// <summary>
/// 定义车的模型
/// </summary>
public interface ICar
{
void run();
}
/// <summary>
/// 定义备胎的模型,备胎用于对应的车
/// </summary>
public interface ISpareWheel
{
void use();
}

/// <summary>
/// 制造车的工厂
/// 产车
/// 产备胎
/// </summary>
public interface ICarFactory
{
ICar CreateCar();
ISpareWheel CreateSpareWheel();
}

#region Benz系列
/// <summary>
/// 奔驰车
/// </summary>
public class BenzCar:ICar
{
public void run()
{
Console.WriteLine("BenzCar is running");
}
}
/// <summary>
/// 奔驰车备胎
/// </summary>
public class BenzCarSpareWheel:ISpareWheel
{
public void use()
{
Console.WriteLine("BenzCar Spare wheel is using");
}
}
/// <summary>
/// 奔驰车工厂
/// </summary>
public class BenzCarFactory : ICarFactory
{
public ICar CreateCar()
{
return new BenzCar();
}

public ISpareWheel CreateSpareWheel()
{
return new BenzCarSpareWheel();
}
}
#endregion

#region 宝马系列
/// <summary>
/// 宝马车
/// </summary>
public class BmwCar:ICar
{
public void run()
{
Console.WriteLine("BmwCar is running...");
}
}
/// <summary>
/// 宝马车备胎
/// </summary>
public class BmwCarSpareWheel:ISpareWheel
{
public void use()
{
Console.WriteLine("BmwCar Spare wheel is using");
}
}
/// <summary>
/// 宝马车工厂
/// </summary>
public class BmwCarFactory : ICarFactory
{
public ICar CreateCar()
{
return new BmwCar();
}

public ISpareWheel CreateSpareWheel()
{
return new BmwCarSpareWheel();
}
}
#endregion

}

测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using DesignPatternTest.SimpleFactory;
using DesignPatternTest.AbstractFactory;

namespace DesignPatternTest
{
class Program
{
static void Main(string[] args)
{
ICarFactory carFactory = new BmwCarFactory();
var bmwCar = carFactory.CreateCar();
var bmwCarSpareWheel = carFactory.CreateSpareWheel();
bmwCar.run();
bmwCarSpareWheel.use();
Console.ReadKey();
}
}
}

//测试结果

 

posted @ 2019-03-09 14:13  chyshx  阅读(160)  评论(0编辑  收藏  举报