这一周做一下关于工厂方法模式的原理笔记。
前言:在任何一个游戏中,打怪肯定是必不可少的原则,而现在很多的MMORPG里面,怪物也是做的种类越来越多,而这些怪物肯定是游戏运行过程中,动态创建的。而在面向对象编程里面,这些怪物也就是被各自的类,动态生成出来的对象,比如说骷髅小怪——就是由他的父类“骷髅怪”实例化出来的,而在游戏中,生成一个怪物,肯定要生成他的模型,他的初始化位置,初始化AI,初始化能力值,最后把这些全部组装在一起,就生成了一个在游戏中的怪物,这样就是生成这个对象的具体流程,但是每一种不同的怪,或者说是每一类不同的怪,完成这些流水线的拼装操作都是相同,但是由于可能需要由不同的系统来负责生成,这就导致了,这种能生成怪物模型的类,可能被不同的系统,都持有并且结构高度近似,这是把产生相同的类群组对象的实现,分开在不同功能中控制了,也不便于代码维护,因此引入了——工厂方法模式。
工厂方法模式
GoF对工厂方法模式的解释是:
“定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象。工厂方法模式让类的实例化程序延迟到子类中实施。”
图解及模拟代码
模拟代码:
这个只是其中的一种实现方式:
using System;
namespace ConsoleApp1
{
//工厂类
public abstract class Creator
{
//设置工厂生产哪种产品
public abstract Product FactoryMethod() ;
}
//生产产品类
public abstract class Product
{
}
//生产产品A类
public class ConcreteProductA : Product
{
//构造时候生产 实际中是有一定的步骤和算法
public ConcreteProductA()
{
Console.WriteLine("生产对象A");
}
}
//生产产品B类
public class ConcreteProductB : Product
{
public ConcreteProductB()
{
Console.WriteLine("生产对象B");
}
}
//生产A产品的工厂
public class ConcreteCreatorProuctA : Creator
{
public ConcreteCreatorProuctA()
{
Console.WriteLine("产生生产A的工厂");
}
public override Product FactoryMethod()
{
//子类上溯为父类
return new ConcreteProductA();
}
}
public class ConcreteCreatorProuctB : Creator
{
public ConcreteCreatorProuctB()
{
Console.WriteLine("产生生产B的工厂");
}
public override Product FactoryMethod()
{
//子类上溯为父类
return new ConcreteProductB();
}
}
class Program
{
static void Main(string[] args)
{
//产品
Product theProduct = null;
//工厂接口
Creator theCreator = null;
//设置为负责生产A的工厂
theCreator = new ConcreteCreatorProuctA();
//生产产品
theProduct = theCreator.FactoryMethod();
//设置为生产B的工厂
theCreator = new ConcreteCreatorProuctB();
theProduct = theCreator.FactoryMethod();
Console.ReadKey();
}
}
}
运行结果:
这个看起来和策略模式、模板方法,有一点类似,模板方法是一个方法里面大部分流程是相似,而仅仅有一部分改变,把方法抽象,而这个工厂是整个类对象的构建过程流程相似,因此把他抽象,而策略模式是一群组算法,抽象,从这三者可以互相理解其中的原理,基本就是当一个步骤有重复或者很相似时候,都会被抽象出一个公共接口,而客户端只管调,不管实现,这大大降低了代码的耦合性。
以上就是本周的读书笔记。