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