i3geek.com
闫庚哲的个人博客

Java设计模式——简单工厂、工厂方法、抽象工厂

简单工厂模式

一个工厂实现类,一个产品抽象类,N个产品实现类。

类图:

../_images/SimpleFactory.jpg

时序图:

../_images/seq_SimpleFactory.jpg

像工厂一样,可以生产出来多个产品。比如一个按钮工厂,可以生产出来圆形按钮、矩形按钮、三角形按钮等等,但是所有的按钮都继承自原始的按钮抽象基类。

特点:传入一个值不同的参数可以生产出不同的按钮。各自的形状属性可能不同,但是都有相同的方法。

优点:不用考虑如何生产的过程。只要传入不同参数就可以得到不同产品。

例如:工厂类 buttonFactory ;产品抽象类 Button ;多个产品实现类 AButton,BButton,CButton;

buttonFactory bfactory = new buttonFactory();
Button abutton = bfactory.getButton("A");//通过传入参数A 获得AButton
Button bbutton = bfactory.getButton("B");//通过传入参数B 获得BButton
Button cbutton = bfactory.getButton("C");//通过传入参数C 获得CButton

问题(缺点)如果要加入新的产品,必须要修改工厂实现类,违背“开闭原则”。

工厂方法模式

一个工厂抽象类,N个工厂实现类,一个产品抽象类,N个产品实现类。

类图:

../_images/FactoryMethod.jpg

时序图:

../_images/seq_FactoryMethod.jpg

在简单工厂模式的基础上,为工厂创建抽象类,生产不同的按钮由不同的工厂实现类完成。

特点:不同工厂生产不同产品。(或者传入一个值不同的参数可以实例化出不同的工厂,从而产出不同的产品)

优点:增加新产品时,无需修改抽象工厂或其他具体的工厂,只需要添加一个具体工厂和具体产品就可以了。

例如:工厂抽象类 Factory ; 多个工厂实现类 AbuttonFactory,BbuttonFactory,CbuttonFactory ;产品抽象类 Button ;多个产品实现类 AButton,BButton,CButton;

buttonFactory bfactory = new AbuttonFactory();//获得AbuttonFactory工厂实现类
Button abutton = bfactory.getButton();//通过传入参数A 获得AButton
bfactory = new BbuttonFactory();//获得BbuttonFactory工厂实现类
Button bbutton = bfactory.getButton();//通过传入参数B 获得BButton
bfactory = new CbuttonFactory();//获得CbuttonFactory工厂实现类
Button cbutton = bfactory.getButton();//通过传入参数C 获得CButton

<更进一步> 工厂抽象类 Factory ; 工厂工具类 BaseFactory ;多个工厂实现类 AbuttonFactory,BbuttonFactory,CbuttonFactory ;产品抽象类 Button ;多个产品实现类 AButton,BButton,CButton;

BaseFactory factory = new BaseFactory();//实例化工厂工具类
buttonFactory bfactory = factory.getFactory("A");//获得AbuttonFactory工厂实现类
Button abutton = bfactory.getButton();//通过传入参数A 获得AButton
bfactory = factory.getFactory("B");//获得BbuttonFactory工厂实现类
Button bbutton = bfactory.getButton();//通过传入参数B 获得BButton
bfactory = factory.getFactory("C");//获得CbuttonFactory工厂实现类
Button cbutton = bfactory.getButton();//通过传入参数C 获得CButton

应用:JDBC中的工厂方法:

Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=DB;user=sa;password=");
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery("select * from UserInfo");

问题(缺点)一个工厂只能生产一类产品对象,如果生产多类产品呢?

抽象工厂模式

一个工厂抽象类,N个工厂实现类,N个产品抽象类,N个产品实现类。

类图:

../_images/AbatractFactory.jpg

时序图:

../_images/seq_AbatractFactory.jpg

在工厂方法模式的基础上,每一个工厂不仅可以生产各自特有的按钮,还可以生产各自特有的输入框。比如,生产圆形按钮的工厂可以生产圆形按钮和圆形输入框;生产方形按钮的工厂可以生产方形按钮和方形输入框……

特点:同一工厂可以生产多种不同类商品。

优点:只需更换工厂的实例,就可以改变全部生产产品(比如将生产圆形的工厂改成生产方形的工厂,则由原工厂生产的按钮、输入框全都变成了方形);保证所有不同类的商品都源自一个工厂;增加新的具体工厂和对应的各类商品实例很方便,无须修改原有系统(比如增加个三角形工厂,再增加三角形按钮和三角形输入框的实现类即可)

例如:工厂抽象类 Factory ; 多个工厂实现类 AFactory,BFactory ;多个产品抽象类(一个产品抽象类可以想象成一类商品) Button,Text ;多个产品实现类 AButton,BButton,AText,BText;

Factory factory = new AFactory(); // 实例化AFactory对象
Button button = factory.getButton(); //获得AButton对象
Text text = factory.getText(); //获得AText对象

factory = new BFactory(); // 实例化BFactory对象
Button button = factory.getButton(); //获得BButton对象
Text text = factory.getText(); // 获得BText对象

应用:软件系统中的界面主题,当主题变更时,所有的按钮、文本框、背景色等一起发生变化。

赞(0)
未经允许不得转载:爱上极客 » Java设计模式——简单工厂、工厂方法、抽象工厂
分享到: 更多 (0)

评论 14

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    向您学习,我的QQ:2104506866!多多指教!
    丙申年(猴)九月初八 2016-10-8

    三五营销2年前 (2016-10-09)回复
  2. #2

    感谢博主分享的经验

    任务易2年前 (2016-10-14)回复
  3. #3

    来看看,学习学习!!

    蒂欧娜2年前 (2016-10-17)回复
  4. #4

    路过~混个脸熟。

    kuyus2年前 (2016-10-20)回复
  5. #5

    学习带来乐趣,谢谢博主!

    QQ-55856182年前 (2016-10-25)回复
  6. #6

    访问您的博客已成习惯!

    网赚论坛2年前 (2016-10-25)回复
  7. #7

    相当不错,自愧不如!

    增达任务网2年前 (2016-10-28)回复
  8. #8

    三天不来手痒痒!

    一生一世套图2年前 (2016-11-01)回复
  9. #9

    我只是来随便看看!

    华夏九州套图2年前 (2016-11-03)回复
  10. #10

    很不错的样子⊙0⊙

    广告任务网2年前 (2016-11-07)回复
  11. #11

    1111

    Desxss2年前 (2016-11-17)回复
  12. #12

    你的博客就像冬天里的一把火!

    增达网2年前 (2016-11-17)回复
  13. #13

    感谢博主分享的经验

    美剧天堂2年前 (2016-11-18)回复
  14. #14

      男友第一次来我家,要和我亲热,这时我的猫跑了进来,男友要赶它,我连忙喊停:不要赶,它喜欢看!
      男友给了我一巴掌:你不是说你是第一次吗?

    增达网2年前 (2016-11-23)回复