您的位置:首页 > 其它

[设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)

2012-09-12 11:08 176 查看
前面的记有简单工厂模式,他的实现所有产品都是在同一个工厂类来实现, 采用静态的方法来返回实例; 工厂模式就是根据不同的产品创建不同的工厂类来返回实例,即使二个产品有某些联系, 还是用二个工厂类来返回实例。 那么抽象工厂类呢? 它是把多个有联系的产品建立一个工厂类, 是针对一系列的产品的。 例如上面的工资计算模块: 深圳北京子公司ITD部门需要另一种计算方式 , HRA部门需要的又是另一种,或深圳子公司下面又有再下一级的子公司,很明显然,各子公司的ITD部门是一系列的, 或者各城市下面的二级子公司也是一系列的,
这样我们就需要用到抽象工厂模式来设计了, 下完整代码:

定义产品接口方法:



using System;

namespace ConsoleApp

{

public interface ISalary

{

void CommandSalary();

}

}




定义二个子公司的抽象类:

深圳子公司:





代码

using System;

namespace ConsoleApp

{

public abstract class ShenZhenSalary : ISalary

{

public virtual void CommandSalary()

{

Console.WriteLine("这是深圳子公司的工资计算模块");

}

}

}




北京子公司:





代码

using System;

namespace ConsoleApp

{

public abstract class BeiJinSalary : ISalary

{

public virtual void CommandSalary()

{

Console.WriteLine("这是北京子公司的工资计算模块");

}

}

}




既然需要添加ITD,HRA二个部门的计算模块, 那就需要在深圳子公司计算的类下面派生出ITD, HRA类, 北京方面也是如此:

北京子公司计算工资的类下面派生出BeiJinItdSalary,BeiJinHraSalary类:





代码

public class BeiJinItdSalary : BeiJinSalary

{

public override void CommandSalary()

{

Console.WriteLine("这是北京子公司ITD的工资计算模块");

}

}

public class BeiJinHraSalary : BeiJinSalary

{

public override void CommandSalary()

{

Console.WriteLine("这是北京子公司HRA的工资计算模块");

}

}




深圳子公司计算工资的类下面派生出ShenZhenItdSalary,ShenZhenHraSalary类:





代码

public class ShenZhenItdSalary : ShenZhenSalary

{

public override void CommandSalary()

{

Console.WriteLine("这是深圳子公司ITD的工资计算模块");

}

}

public class ShenZhenHraSalary : ShenZhenSalary

{

public override void CommandSalary()

{

Console.WriteLine("这是深圳子公司HRA的工资计算模块");

}

}




这样就定义完成一系列产品(把部门当成工厂类的产品,下面也是这样解释)的类了, 下面就是设计怎样来管理这些类。首先需要定义一个工厂类的接品方法:



using System;

namespace ConsoleApp

{

public interface IFactory

{

ShenZhenSalary CreateShenZhenSalary();

BeiJinSalary CreateBeiJinSalary();

}

}




根据上面的介绍, 把产品分为二系列, 分别是ITD与HRA,下面就需要定义ITD与HRA二个产品的工厂类了吧!

ITD工厂类:





代码

using System;

namespace ConsoleApp

{

public class ItdFactory : IFactory

{

public ShenZhenSalary CreateShenZhenSalary()

{

return new ShenZhenItdSalary();

}

public BeiJinSalary CreateBeiJinSalary()

{

return new BeiJinItdSalary();

}

}

}




HRA工厂类:





代码

using System;

namespace ConsoleApp

{

public class HraFactory:IFactory

{

public ShenZhenSalary CreateShenZhenSalary()

{

return new ShenZhenHraSalary();

}

public BeiJinSalary CreateBeiJinSalary()

{

return new BeiJinHraSalary();

}

}

}




这样就已经完成了一系列产品的定义, 其它子公司部门计算方式添加进来, 不会影响原先存在的代码, 方便维护, 下面列出调用这些工厂类的方法:





代码

using System;

namespace ConsoleApp

{

class Program

{

public static void Main(string[] args)

{

IFactory Factory = new ItdFactory(); //实例化Itd工厂类

ShenZhenSalary SalarySzItd = Factory.CreateShenZhenSalary();

SalarySzItd.CommandSalary(); //调用深圳ITD公司计算过程

BeiJinSalary SalaryBjItd = Factory.CreateBeiJinSalary();

SalaryBjItd.CommandSalary(); //调用北京ITD公司计算过程

Factory = new HraFactory(); //实例化Hra工厂类

ShenZhenSalary SalarySzHra = Factory.CreateShenZhenSalary();

SalarySzHra.CommandSalary(); //调用深圳Hra公司计算过程

BeiJinSalary SalaryBjHra = Factory.CreateBeiJinSalary();

SalaryBjHra.CommandSalary(); //调用北京Hra公司计算过程

Console.ReadLine();

}

}

}




输出:

这是深圳子公司ITD的工资计算模块

这是北京子公司ITD的工资计算模块

这是深圳子公司HRA的工资计算模块

这是北京子公司HRA的工资计算模块

抽象工类模式其实分为:抽象工厂类,实现抽象工厂类的具体返回实例的工厂类,抽象产品类,具体产品类,和工厂模式差不多, 区别就是抽象工厂模式把一系列的产品进行统一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: