3.简单工厂模式

3.创建型模式-简单工厂模式


3.1 基础知识

学习难度:2

使用频率:3

总分:7

定义

简单工厂模式(Simple Factory Pattern)提供了一个单独的工厂类,该工厂类用于根据客户端的请求来创建不同类型的对象,而客户端无需了解对象的创建过程。

说人话

工厂分支判断实例化不同产品。

实现步骤

  • 产品接口:定义展示产品方法
  • 多个具体产品类:实现产品接口
  • 简单工厂类:定义创建产品方法,传入参数分支判断返回不同产品
  • 客户端:实例化简单工厂,传入不同参数,得到不同产品,展示不同产品

说明

简单工厂模式违反开放封闭原则。适用于简单得到对象的情况。


3.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 class SimpleFactory
{
    public IProduct CreateProduct(string type)
    {
        switch (type)
        {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            default:
                throw new ArgumentException("Invalid type.", "type");
        }
    }
}

客户端

class Program
{
    static void Main(string[] args)
    {
        SimpleFactory simpleFactory = new SimpleFactory();

        IProduct productA = simpleFactory.CreateProduct("A");
        productA.Show(); //我是ProductA

        IProduct productB = simpleFactory.CreateProduct("B");
        productB.Show(); //我是ProductB
    }
}

3.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 static class AnimalFactory
{
    public static IAnimal CreateAnimal(string animalType)
    {
        switch (animalType)
        {
            case "Dog":
                return new Dog();
            case "Cat":
                return new Cat();
            default:
                throw new ArgumentException("Invalid animal type");
        }
    }
}

客户端

class Program
{
    static void Main(string[] args)
    {
        // 使用简单工厂创建狗和猫
        IAnimal dog = AnimalFactory.CreateAnimal("Dog");
        IAnimal cat = AnimalFactory.CreateAnimal("Cat");

        dog.Speak(); //狗汪汪叫!
        cat.Speak(); //猫喵喵叫!
    }
}

3.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 class PrimitiveModelSimpleFactory
{
    public IProductPrimitiveModel CreatePrimitiveModelProduct(PrimitiveType primitiveType)
    {
        switch (primitiveType)
        {
            case PrimitiveType.Cube:
                return new ProductCube();
            case PrimitiveType.Sphere:
                return new ProductSphere();
            default:
                Debug.LogError("还没有这个产品!");
                return null;
        }
    }
}

客户端

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

    void Start()
    {
        PrimitiveModelSimpleFactory primitiveModelSimpleFactory = new PrimitiveModelSimpleFactory();
        productCube = primitiveModelSimpleFactory.CreatePrimitiveModelProduct(PrimitiveType.Cube);
        productSphere = primitiveModelSimpleFactory.CreatePrimitiveModelProduct(PrimitiveType.Sphere);
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            productCube.CreatePrimitiveModel();
        }
    
        if (Input.GetMouseButtonDown(1))
        {
            productSphere.CreatePrimitiveModel();
        }
    }
}

运行结果



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

×

喜欢就点赞,疼爱就打赏