`
zmo_xu
  • 浏览: 63963 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

java设计模式全解[2]-抽象工厂模式

阅读更多

 

抽象工厂模式(Abstract Factory) 

<o:p></o:p> 

本文参考Terrylee的博客 另外可参考lintomnywww.iteye.com/article/70952 的抽象工厂[他的代码相对我的更详细]

 概述
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
zmo_xu在这里,直接引用Terrylee给出的例子:这里我引用他的分析,然后给出代码,因为抽象工厂,说白了就是将很多相同的类的方法抽象到抽象类或者接口里面然后通过父类引用子类实例来实现,而这个回调在封装到一个工厂类里面[还是那句老话,大家一起讨论,共同进步,我有错的地方请一定告诉我]

虚拟案例<o:p></o:p>

中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。<o:p></o:p>

员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。<o:p></o:p>

为了简化系统,我们假设员工基本工资总是4000美金。<o:p></o:p>

中国企业奖金和个人所得税的计算规则是:<o:p></o:p>

奖金 = 基本工资(4000) * 10%<o:p></o:p>

个人所得税 = (基本工资 + 奖金) * 40%<o:p></o:p>

我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。<o:p></o:p>

案例分析<o:p></o:p>

奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)<o:p></o:p>

工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。<o:p></o:p>

工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。

现在又要将程序拿到美国使用 

针对美国企业为系统建模<o:p></o:p>

为了拓展国际市场,我们要把该系统移植给美国公司使用。<o:p></o:p>

美国企业的工资计算同样是: 员工的工资 = 基本工资 + 奖金 - 个人所得税。<o:p></o:p>

但是他们的奖金和个人所得税的计算规则不同于中国企业:<o:p></o:p>

美国企业奖金和个人所得税的计算规则是:<o:p></o:p>

        奖金 = 基本工资 * 15 %<o:p></o:p>

        个人所得税 = (基本工资 * 5% + 奖金 * 25%)   <o:p></o:p>

根据前面为中国企业建模经验,我们仅仅将ChineseTaxChineseBonus修改为AmericanTaxAmericanBonus

[不是太稳定提交保存下]

好现在给出代码:代码比较断就写在一个文件里面了

java 代码
  1. package zmo;   
  2.   
  3. public interface Tax   
  4. {   
  5.   
  6.     public double Calculate();   
  7. }   
  8.   
  9. //-----------------   
  10. package zmo;   
  11.   
  12. public interface Bonus   
  13. {   
  14.     public double Calculate();   
  15. }   
  16. //------------------   
  17. package zmo;   
  18.   
  19. public class ChineseBonus implements Bonus   
  20. {   
  21.   
  22.     public double Calculate()   
  23.     {   
  24.         return Constant.BASE_SALARY * 0.1;   
  25.     }   
  26.   
  27. }   
  28. //----------------------   
  29. package zmo;   
  30.   
  31. public class ChineseTax implements Tax   
  32. {   
  33.   
  34.     public double Calculate()   
  35.     {   
  36.         return (Constant.BASE_SALARY+Constant.BASE_SALARY*0.1) * 0.4;   
  37.     }   
  38. }   
  39. //--------------------------   
  40. package zmo;   
  41.   
  42. public class Constant   
  43. {   
  44.     public static double BASE_SALARY = 4000;   
  45. }   
  46. //--------------------------   
  47. package zmo;   
  48.   
  49. import zmo.ChineseBonus;   
  50. import zmo.ChineseTax;   
  51.   
  52.   
  53. public class Factory   
  54. {   
  55.     public Tax CreateTax()   
  56.     {   
  57.         return new ChineseTax();   
  58.     }   
  59.   
  60.     public Bonus CreateBonus()   
  61.     {   
  62.         return new ChineseBonus();   
  63.     }   
  64. }   
但是这样当我们要改变业务逻辑时 还是要修改工厂类来实现American 所以我们要请出今天的主角Class,呵呵,没有打错就是Class.zmo_xu在这里要使用Class的forname方法 先给出一段演示实例
java 代码
  1. package unit;   
  2.   
  3. public class Test   
  4. {   
  5.   
  6.     public void show()   
  7.     {   
  8.         System.out.println("看到这个输出表示你已经理解了反射机制");   
  9.     }   
  10. }   
  11. package unit;   
  12.   
  13. public class ClassShow   
  14. {   
  15.   
  16.     public static void main(String[] args)   
  17.     {   
  18.         try  
  19.         {   
  20.             Class ctx=Class.forName("unit.Test");   
  21.             Object o=ctx.newInstance();   
  22.             Test test=(Test)o;   
  23.             test.show();   
  24.         }   
  25.         catch (ClassNotFoundException e)   
  26.         {   
  27.             e.printStackTrace();   
  28.         }   
  29.         catch (InstantiationException e)   
  30.         {   
  31.             e.printStackTrace();   
  32.         }   
  33.         catch (IllegalAccessException e)   
  34.         {   
  35.             e.printStackTrace();   
  36.         }   
  37.     }   
  38. }   
最后就是用ResourceBundle来帮定资源文件 来实现Factory类这样就可以实现 不改源代码就能修改对应的实例 具体方法在builder  建造者模式里面再详细讲吧 ,那个好像不属于抽象工厂的范畴了
分享到:
评论
4 楼 liuweihong 2007-07-18  
这是抽象工厂模式吗
3 楼 wntaimoshen 2007-07-18  
跑题了吧兄弟
2 楼 xieye 2007-06-12  
哦,多么优雅的代码
1 楼 zmo_xu 2007-06-11  
呵呵 这一篇就简单的讲讲 如果要深入了解 可以参见社区里面别的帖子 ,在这里给出这篇文章只是想人帖子看起来更系列一点

相关推荐

    java设计模式----抽象工厂模式

    java设计模式----抽象工厂模式,简单工厂模式代码 代码内部

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式习题答案-抽象工厂、生成器.ppt

    设计模式习题答案-抽象工厂、生成器.ppt

    java常用设计模式-抽象工厂模式

    java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...

    java设计模式-抽象工厂模式

    总的来说,抽象工厂模式在Java中是一种非常实用的设计模式,它可以帮助我们封装产品的创建过程,降低系统间的耦合度,同时提供了更好的可扩展性,使得添加新的产品族或者产品变得更加容易。在处理具有多种变体的复杂...

    Java设计模式教程 - Java设计模式 - 抽象工厂模式

    抽象工厂模式是Java设计模式中的一种创建型模式,它提供了创建对象族的接口,而具体的对象族由子类决定。这种模式的主要目的是隔离接口与实现,使得客户端代码在更换产品族时无需修改,增强了软件的可扩展性和可维护...

    Java设计模式-抽象工厂

    抽象工厂模式在Java开发中广泛应用,尤其是在框架和库的设计中。它帮助我们构建可扩展、易于维护的代码,是理解面向对象设计原则和设计模式的重要实践。通过学习抽象工厂模式,开发者可以更好地处理复杂的对象创建...

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    java设计模式---诙谐易懂版

    例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...

    创建型设计模式----抽象工厂模式

    抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...

    3.java设计模式-创建者模式-抽象工厂模式.pdf

    抽象工厂模式是创建型设计模式中的一种,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。抽象工厂模式强调产品的系列,对于有多个产品等级结构的系统非常有用。在抽象工厂模式中,一个工厂负责创建多个...

    设计模式-抽象工厂模式javademo

    抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...

    C# 设计模式系列教程-抽象工厂模式

    【抽象工厂模式】是一种创建型设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式的关键在于抽象工厂,它定义了一组用于创建产品对象的接口,这些产品属于同一产品族。...

    java抽象工厂模式实例----手机工厂

    抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在Java编程中,这个模式经常被用来实现跨平台或者不同品牌产品的一致性...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

    设计模式-抽象工厂-Java 源码

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而具体的对象族由子类决定。这种模式允许系统在不指定具体产品的前提下,能够创建一系列相关或相互依赖的对象,同时避免了硬编码所造成的...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂模式可以帮助我们创建一个工厂接口,该接口声明了创建这些组件的方法,然后为每种操作系统实现一个具体的工厂类。 ```java // 抽象工厂接口 public interface GUIFactory { Button createButton(); ...

    Java设计模式----通俗易懂版

    - 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,无需指定它们的具体类。 - 建造者模式:将复杂对象的构建与其表示分离,使同样的构建过程能创建不同的表示。 - 原型模式:通过复制已有对象来创建...

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

Global site tag (gtag.js) - Google Analytics