4.工厂方法模式

4.创建型模式-工厂方法模式


4.1 基础知识

学习难度:2

使用频率:5

总分:9

定义

工厂方法模式(Factory Method Pattern)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

说人话

提供工厂接口,实例化不同的具体工厂来得到不同的具体产品。

结构图

实现步骤

  • 产品接口:定义展示产品方法
  • 多个具体产品类:实现产品接口
  • 工厂接口:定义创建产品方法
  • 多个具体工厂类:实现工厂接口,每个工厂返回不同的产品
  • 客户端:实例化具体工厂,得到不同的产品并展示

说明

产品接口和具体产品类与简单工厂模式一致,可以复用。与简单工厂相比,工厂方法模式多了一个原始约束工厂的工厂接口。一个具体工厂对应一个具体产品。


4.2 模版代码

产品接口和具体产品类

public interface IProduct
{
    void Show();
}

public class ProductA : IProduct
{
    public void Show()
    {
        Console.WriteLine("我是ProductA");
    }
}

public class ProductB : IProduct
{
    public void Show()
    {
        Console.WriteLine("我是ProductB");
    }
}

工厂接口和具体工厂类

public interface IFactory
{
   Product CreateProduct();
}

public class FactoryA : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductA();
    }
}

public class FactoryB : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductB();
    }
}

客户端

class Program
{
    static void Main(string[] args)
    {
        IFactory factoryA = new FactoryA();
        IProduct productA = factoryA.CreateProduct();
        productA.Show();//我是ProductA
        
        IFactory factoryB = new FactoryB();
        IProduct productB = factoryB.CreateProduct();
        productB.Show();//我是ProductA
    }
}

4.3 CSharp实践

实践需求

使用工厂方法模式创建猫和狗

动物接口和具体动物类

// 动物接口
public interface IAnimal
{
    void Speak();
}

//猫
public class Cat : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("猫喵喵叫!");
    }
}

//狗
public class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("狗汪汪叫!");
    }
}

动物工厂接口和具体动物工厂

// 动物工厂接口
public interface IAnimalFactory
{
    IAnimal CreateAnimal();
}

//猫工厂
public class CatFactory : IAnimalFactory
{
    public IAnimal CreateAnimal()
    {
        return new Cat();
    }
}

//狗工厂
public class DogFactory : IAnimalFactory
{
    public IAnimal CreateAnimal()
    {
        return new Dog();
    }
}

客户端

class Program
{
    static void Main(string[] args)
    {
        // 使用狗工厂创建狗
        IAnimalFactory dogFactory = new DogFactory();
        IAnimal dog = dogFactory.CreateAnimal();
        dog.Speak(); // 狗汪汪叫!

        // 使用猫工厂创建猫
        IAnimalFactory catFactory = new CatFactory();
        IAnimal cat = catFactory.CreateAnimal();
        cat.Speak(); // 猫喵喵叫!
    }
}

4.4 Unity实践

实践需求

使用工厂方法模式实现点击鼠标左键随机位置创建立方体,点击鼠标右键随机位置创建球

原始模型产品接口和具体原始模型产品类

public interface IProductPrimitiveModel
{
    public void CreatePrimitiveModel();
}

public class ProductCube : IProductPrimitiveModel
{
    public void CreatePrimitiveModel()
    {
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.position = new Vector3(Random.Range(-3, 3), Random.Range(-3, 3), Random.Range(-3, 3));
    }
}

public class ProductSphere : IProductPrimitiveModel
{
    public void CreatePrimitiveModel()
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = new Vector3(Random.Range(-3, 3), Random.Range(-3, 3), Random.Range(-3, 3));
    }
}

原始模型工厂接口和具体原始模型工厂

public interface IFactoryPrimitiveModel
{
    public IProductPrimitiveModel CreatePrimitiveModelProduct();
}

public class FactoryCube : IFactoryPrimitiveModel
{
    public IProductPrimitiveModel CreatePrimitiveModelProduct()
    {
        return new ProductCube();
    }
}

public class FactorySphere : IFactoryPrimitiveModel
{
    public IProductPrimitiveModel CreatePrimitiveModelProduct()
    {
        return new ProductSphere();
    }
}

客户端

public class TestFactoryMethodPattern : MonoBehaviour
{
    private IProductPrimitiveModel productCube;
    private IProductPrimitiveModel productSphere;

    void Start()
    {
        IFactoryPrimitiveModel cubeFactory = new FactoryCube();
        productCube = cubeFactory.CreatePrimitiveModelProduct();
        
        IFactoryPrimitiveModel sphereFactory = new FactorySphere();
        productSphere = sphereFactory.CreatePrimitiveModelProduct();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            productCube.CreatePrimitiveModel();
        }

        if (Input.GetMouseButtonDown(1))
        {
            productSphere.CreatePrimitiveModel();
        }
    }
}

运行结果

和简单工厂一致



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏