java 工厂方法模式 简单工厂_Java设计模式——简单工厂、工厂方法、抽象工厂...

简单工厂模式

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

类图:

9ad7edbdba487ff29c9f0d521a498d37.png

时序图:

556bfe4dae1b7b86ca6facf6fb436865.png

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

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

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

例如:工厂类 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个产品实现类。

类图:

76a446fa336a44868099cd8121af33d3.png

时序图:

bc7bcc78cea3df57813c664ffb0b8fdc.png

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

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

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

例如:工厂抽象类 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个产品实现类。

类图:

cb19916209b3fdb9743ba6023b97246f.png

时序图:

70c52431f9b2512ec8fcb3c4326af24d.png

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

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

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

例如:工厂抽象类 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值