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