设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

时间:2021-09-09 06:04:46
      前几讲链接:
      1、 设计模式杂谈:开头篇
      2、 设计模式杂谈:创建型模式之工厂方法(Factory Method)
      3、 设计模式杂谈:创建型模式之单件模式(Singleton)
      
      在上一讲中,对系统做了进一步的优化,使之更灵活,以适合需求的变化,也经过几位热心朋友的指点,对一些关键的细节进行了修正,自己也有了更进一步的理解,在此非常感谢他们。

      在这一讲,来看看抽象工厂模式的运用。抽象工厂模式目的是要解决“一系列对象”的创建工作,这里指的是一系列的对象,这跟工厂方法创建某个对象有点类似,个人觉得可以认为工厂方法是一个比较特殊的抽象工厂,是抽象工厂模式的特殊用法,所以在结构上有点类似。

      抽象工厂模式很有用,因为在很多情况下,我们针对某一个解决方案,需要的不仅仅是一个对象就够了,而是需要创建一系列的相关对象来完成。如李建忠老师讲的一个案例里,关于游戏场景的,一个游戏场景往往有许多东西组成,如树,道路,河流等等,而在一个游戏里往往会有多个不同的场景,针对这些不同的场景就应该有不同的树、道路和、河流这些东西。这个时候树、道路、河流这些就是一系列的对象,我们要根据不同的场景来创建相应的这些对象,这里就可以用抽象工厂方法来解决。这里讲的有些笼统了,因为是已有的东西,就带过讲讲了,有兴趣的朋友可以去看李建忠老师的Webcast课程。

      现在我们再来重新回顾前面讲的案例,在前面几篇里,我是把整个的员工工资计算当作一个对象来处理,这里有点违反了设计原则中的“单一职责原则”,这里工资的计算是根据基本工资、奖金和个人所得税来计算的,基本工资这里当作一个输入项,暂且不管,而奖金和个人所得税本身就有自己的业务算法(这里的算法很简单,不过纯粹为了说明设计模式运用,这个就暂且不管,呵呵),所以这里我们应该把奖金和个人所得税的计算单独拿出来,这样更符合“单一职责原则”。对于奖金的计算,不管是美国公司还是中国公司 ,就认为只有一个GetBonus方法,用来返回一个double型的数值,这样我们可以抽象出一个接口,如下:
1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)namespace  DesignPattern.IBLL
2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
3设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public interface IBonus
4设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
5设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        double GetBonus(double basicSalary);
6设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

8 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      下面分别就美国公司和中国公司实现该接口:
      美国公司:
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.BLL
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public class AmericanBonus : IBLL.IBonus
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public double GetBonus(double basicSalary)
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return basicSalary * 0.15;//奖金计算
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

14设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

15 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      中国公司:
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.BLL
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public class ChineseBonus : IBLL.IBonus
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public double GetBonus(double basicSalary)
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return basicSalary * 0.1;//奖金计算
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

14设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

15 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      同样对于个人所得税,也作如上处理:
      接口:
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.IBLL
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public interface ITax
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        double GetTax(double basicSalary);
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

12 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      美国公司:
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.BLL
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public class AmericanTax : IBLL.ITax
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public double GetTax(double basicSalary)
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return basicSalary * 0.05 + basicSalary * 0.15 * 0.25;//个人所得税计算
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

14设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

15 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      中国公司:
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.BLL
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public class ChineseTax : IBLL.ITax
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public double GetTax(double basicSalary)
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return (basicSalary + basicSalary * 0.1* 0.4;//个人所得税计算
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

14设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

15 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      具体实现对象的类我们已经设计好,接下来看看抽象工厂是如何工作的。这里已经很明确我们要返回的有二个对象,那就是计算奖金的IBonus对象和计算个人所得税的ITax对象,所以我们可以抽象出工厂接口如下:
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.IBLL
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public interface IFactory
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        IBonus CreateBonus();
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        ITax CreateTax();
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

14 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      针对不同公司来创建相关的具体对象:
      美国公司 :
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.Factory
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public class AmericanFactory : IBLL.IFactory
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public IBLL.IBonus CreateBonus()
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return new BLL.AmericanBonus();
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
14设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public IBLL.ITax CreateTax()
15设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
16设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return new BLL.AmericanTax();
17设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

18设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
19设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

20设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

21 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      中国公司 :
      
 1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)using  System;
 2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Collections.Generic;
 3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) using  System.Text;
 4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
 5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) namespace  DesignPattern.Factory
 6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) {
 7设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    public class ChineseFactory : IBLL.IFactory
 8设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    {
 9设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public IBLL.IBonus CreateBonus()
10设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
11设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return new BLL.ChineseBonus();
12设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

13设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
14设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        public IBLL.ITax CreateTax()
15设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        {
16设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)            return new BLL.ChineseTax();
17设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)        }

18设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
19设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)    }

20设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)}

21 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)

      在最后计算员工工资时,我们只要得到一个计算奖金的对象和计算个人所得税 的对象,就可以得到最终的工资了
1 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)double  basicSalary  =  Convert.ToDouble(txtBasicSalary.Text.Trim());
2 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)                 double  salary;
3 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
4 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)                IBLL.IBonus bonus  =  FactoryUtility.Factory.CreateBonus();
5 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)                IBLL.ITax tax  =  FactoryUtility.Factory.CreateTax();
6 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
7 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)                salary  =  basicSalary  +  bonus.GetBonus(basicSalary)  -  tax.GetTax(basicSalary);
8 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)
9 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory)                lbSalary.Text  =  salary.ToString();

      最后声明一下,这篇文章跟TerryLee 的.NET设计模式(3):抽象工厂模式(Abstract Factory) 在实现上可以说是一样的,只不过加上我自己的说明而已,这样做目的是想通过重构的方法逐渐改善原有代码,使之更加可维护。并且,也可以通过比较更好的理解工厂方法和抽象工厂模式的实际应用。李建忠的课程里有这么一句话“设计模式是通过重构的方法来逐步实现的”(好象不是原话了,呵),确实,对于一个复杂的系统来说,我们不可能一下子就能够设计的很完善,通过重构可以有一个递进的顺序。

      源码下载(抽象工厂模式)

      下一篇:设计模式杂谈:创建型模式之生成器模式(Builder Pattern)