抽象工厂模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
//抽象苹果类
public abstract class Apple {
//抽象苹果种植方法
public abstract void PlantApple();
}
public class BJApple : Apple
{
//北京苹果种植方法
public override void PlantApple()
{
Console.WriteLine("种植北京苹果");
}
}
public class SHApple : Apple
{
//北京苹果种植方法
public override void PlantApple()
{
Console.WriteLine("种植上海苹果");
}
}
//抽象橘子类
public abstract class Orange
{
//抽象橘子种植方法
public abstract void PlantOrange();
}
public class BJOrange : Orange
{
//北京橘子种植方法
public override void PlantOrange()
{
Console.WriteLine("种植北京橘子");
}
}
public class SHOrange : Orange
{
//上海橘子种植方法
public override void PlantOrange()
{
Console.WriteLine("种植上海橘子");
}
}
//抽象果园类
public abstract class Orchard {
//抽象创建苹果方法
public abstract Apple CreateApple();
//抽象创建橘子方法
public abstract Orange CreateOrange();
}
//北京果园
public class BJOrchard : Orchard
{
//创建北京苹果
public override Apple CreateApple()
{
return new BJApple();
}
//创建北京橘子
public override Orange CreateOrange()
{
return new BJOrange();
}
}
//上海果园
public class SHOrchard : Orchard
{
//创建上海苹果
public override Apple CreateApple()
{
return new SHApple();
}
//创建上海橘子
public override Orange CreateOrange()
{
return new SHOrange();
}
}
class Program
{
static void Main(string[] args)
{
//创建北京果园实例
Orchard bjFruiFactory = new BJOrchard();
//北京果园创界北京苹果
Apple bjApple = bjFruiFactory.CreateApple();
//北京果园创界北京橘子
Orange bjOrange = bjFruiFactory.CreateOrange();
//北京果园种植北京苹果
bjApple.PlantApple();
//北京果园种植北京橘子
bjOrange.PlantOrange();
//创建上海果园实例
Orchard shFruiFactory = new SHOrchard();
//上海果园创界北京苹果
Apple shApple = shFruiFactory.CreateApple();
//上海果园创界北京橘子
Orange shOrange = shFruiFactory.CreateOrange();
//上海果园种植北京苹果
shApple.PlantApple();
//上海果园种植北京橘子
shOrange.PlantOrange();
Console.ReadKey();
}
}
}
代码解析
以上例代码主要实现了抽象工厂模式。实例中创建了两个抽象类,即苹果类Apple和橘子类Orange,由Apple类派生出两个具体的苹果类:北京苹果类BJApple和上海苹果类SHApple,用PlantApple方法来种植北京苹果和上海苹果。同样,Orange类也派生出两个具体的橘子类:BJOrange和SHOrange,用PlantOrange方法来种植北京橘子和上海橘子。再创建一个抽象果园类 Orchard,该类相当于抽象工厂类,提供创建 Apple 类和 Orange 类的抽象方法,由 Orchard类派生出两个具体的果园类:北京果园类 BJOrchard 和上海果园类 SHOrchard,分别用来创建北京的水果和上海的水果。这样就完成了对两个地区果园中不同种类水果的创建。在main函数中,创建Apple类和Orange类只依赖于Orange类的两个创建的方法,而不依赖于具体的Apple类和Orange类的派生类。这里同样满足了依赖倒置原则。
**说明:**工厂模式主要实现了类型的创建,属于创建型设计模式。简单工厂模式通过一个具体工厂类,利用具体的创建方法选择性地创建单一类实例;工厂方法模式通过一个抽象的工厂类,利用一个抽象的创建方法创建单一类实例;抽象工厂模式则通过一个抽象的工厂类,利用多个抽象方法创建一组相关联的类实例。
**技巧:**从果园种植水果的应用中可以看出,如果只有一个果园且果园中只有苹果和橘子固定的两种水果,就可以使用简单工厂方法;如果果园的规模在不断扩大,水果的品种在不断增加,这时候就需要使用工厂方法模式;如果需要在多个地区建造果园,而且果园中同种水果也存在不同的品种,就需要使用抽象工厂模式来为不同的果园中的水果提供一系列的创建方法。