简单的说,工厂模式替代了new Class( )的过程,将不同类型对象的创建封装了起来。
优点:
对象缓存
回收不再使用的对象,重复利用封装
有些对象的创建逻辑比较复杂,而调用者不需要知道。
符合迪米特原则。解耦
工厂返回的对象类型可以是抽象类或接口,避免了调用者直接与具体类发生耦合。
符合依赖倒置原则,模块间的依赖通过抽象发生。
举例:
游戏中,角色会使用多把武器,角色只需要通过武器的ID来获取武器对象即可,不需要自己实现具体的细节。
此时可以创建一个WeaponFactory,为角色创建需要的武器。
public class WeaponFactory
{
public IWeapon CreateWeapon(int id)
{
// 通过id在武器配置文件中找到武器对应的类名
// 看对象池中有没有可利用的武器对象
// 没有,则使用反射创建武器对象
// 返回武器
}
}
调用者
IWeapon currentWeapon = weaponFactory.CreateWeapon(1001);
这里看出,调用者只依赖了抽象,即武器对象实现的接口IWeapon,并没有依赖具体的武器类,符合了依赖倒置原则,达到了解耦的目的。
衍生
简单工厂
单例工厂,有时工厂只需要有一个实例。多工厂
不同产品的创建区别较大时,可以使用多个子类工厂进行不同产品的创建,可以避免所有逻辑都集中在一个工厂内。
abstract class HumanFactory
{
abstract IHuman CreateHuman( );
}
class AsiaHumanFactory : HumanFactory
{
override IHuman CreateHuman()
{
}
}