[设计模式整理笔记 四] 抽象工厂模式(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的工资计算模块
抽象工类模式其实分为:抽象工厂类,实现抽象工厂类的具体返回实例的工厂类,抽象产品类,具体产品类,和工厂模式差不多, 区别就是抽象工厂模式把一系列的产品进行统一。
这样我们就需要用到抽象工厂模式来设计了, 下完整代码:
定义产品接口方法:
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的工资计算模块
抽象工类模式其实分为:抽象工厂类,实现抽象工厂类的具体返回实例的工厂类,抽象产品类,具体产品类,和工厂模式差不多, 区别就是抽象工厂模式把一系列的产品进行统一。
相关文章推荐
- [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)
- Java设计模式笔记(3)抽象工厂模式
- 设计模式学习笔记(3) - 抽象工厂模式
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
- 设计模式解析(第二版)笔记6 Abstract Factory 抽象工厂模式
- 菜鸟学设计模式系列笔记之抽象工厂模式
- [设计模式整理笔记 二] 简单工厂模式(Simple Factory)
- 设计模式学习笔记——抽象工厂模式
- 设计模式笔记-抽象工厂模式
- 【笔记】简单整理23种设计模式及实例使用
- 笔记:设计模式(3)-Abstract Factory抽象工厂模式
- 设计模式之--抽象工厂模式(学习分析笔记)
- [设计模式整理笔记 三] 工厂模式(Factory)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- [设计模式整理笔记 三] 工厂模式(Factory)
- 设计模式笔记(四)--工厂方法模式、抽象工厂模式
- 设计模式学习笔记--抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式 笔记 抽象工厂模式 Abstract Factory
- [设计模式整理笔记 五] 创建者模式(Builder)