陈巧倩

设计模式-抽象工厂模式

· 230 words · 2 minutes to read
Categories: CSharp
Tags: Design Pattern

Abstract Factory抽象工厂模式属于创建型设计模式,用于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

Design Pattern:Abstract Factory 🔗

基本介绍 🔗

构成 🔗

  • AbstractFactory:抽象工厂,用于创建抽象产品的接口。
  • ConcreteFactory:实际工厂,实现 AbstractFactory 接口以创建具体产品的类。
  • AbstractProduct:抽象产品,声明一种产品对象的接口。
  • ConcreteProduct:实际产品,实现 AbstractProduct 接口以创建产品的类。
  • Client:客户,持有AbstractFactory 和 AbstractProduct 接口创建一系列相关对象的类。

优点 🔗

  • 将系列产品的创建工作延迟到具体工厂的子类中,Client代码和具体产品类的代码分离,降低耦合度。
  • 促进了产品的一致性,简化了产品之间的交换。

缺点 🔗

  • 由于使系列产品保持一致性,导致了加入新系列产品的难度增加

实例 🔗

C#中抽象工厂模式的实例,我们生活的大陆上每天都在发生着流血惨案,食草动物不停的被食肉动物吞噬。

  • AbstractFactory
//地球大陆    
public abstract class LandFactory
{
    public abstract Herbivore CreateHerbivore();//食草动物
    public abstract Carnivore CreateCarnivore();//食肉动物
}
  • ConcreteFactory
//欧洲大陆    
class EuropeFactory : LandFactory
{
    public override Herbivore CreateHerbivore()
    {
        return new Antelope();
    }
    public override Carnivore CreateCarnivore()
    {
        return new Lion();
    }
}
//非洲大陆
class AmericaFactory : LandFactory
{
    public override Herbivore CreateHerbivore()
    {
        return new Squirrel();
    }
    public override Carnivore CreateCarnivore()
    {
        return new Wolf();
    }
}
  • AbstractProduct
//食草动物基类
abstract class Herbivore
{
}
//食肉动物基类
abstract class Carnivore
{
    public abstract void Eat(Herbivore h);
}
  • Product
//羚羊
class Antelope : Herbivore
{
}
//狮子
class Lion : Carnivore
{
    public override void Eat(Herbivore h)
    {
        Console.WriteLine(this.GetType().Name + " -> " + h.GetType().Name);
    }
}
//松鼠
class Squirrel : Herbivore
{
}
//狼
class Wolf : Carnivore
{
    public override void Eat(Herbivore h)
    {
        Console.WriteLine(this.GetType().Name + " -> " + h.GetType().Name);
    }
}
  • Client
class World
{
    private Herbivore _herbivore;
    private Carnivore _carnivore;

    public AnimalWorld(ContinentFactory factory)
    {
        _carnivore = factory.CreateCarnivore();
        _herbivore = factory.CreateHerbivore();
    }
    public void RunFoodChain()
    {
        _carnivore.Eat(_herbivore);
    }
}

实际运行:

LandFactory europe = new EuropeFactory();
World world = new World(europe);
world.RunFoodChain();

LandFactory america = new AmericaFactory();
world = new World(america);
world.RunFoodChain();

输出:
    Lion -> Antelope
    Wolf -> Squirrel

结论 🔗

搬砖愉快!