设计模式简单工厂.docx
- 文档编号:28420912
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:10
- 大小:49.36KB
设计模式简单工厂.docx
《设计模式简单工厂.docx》由会员分享,可在线阅读,更多相关《设计模式简单工厂.docx(10页珍藏版)》请在冰豆网上搜索。
设计模式简单工厂
简单工厂设计模式
1.1摘要
本文从面向对象的角度对java接口的概念、作用以及使用它的好处做分析,讲解面向接口编程的方法,结合初步接触软件开发的人员习惯,从简单工厂设计模式的概念和其结构以及用途进行解析,重点讲解简单工厂设计模式在软件开发过程中的作用和好处,通过一些实例来说明简单工厂设计模式的特点。
2.1关键字
面向对象;java接口;接口编程;简单工厂设计模式。
3.1开发工具
Eclipsejava语言开发
4.1简单工厂模式动机与定义:
在实际的软件开发过程中有时需要创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。
在这种情况下,可以通过传入不同的参数从而获取不同的对象,理由Java语言的特征,习惯上将创建其他类实例的方法定义为static方法,外部不需要实例化这个类就可以直接调用该方法来获得需要的对象,该方法也成为静态工厂方法。
4.1.1模式动机
考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮,矩形按钮等),这些按钮都源自同一个基类,不过在继承基类之后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
4.1.2模式定义
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
5.1简单工厂模式结构
a、Factory(工厂角色)
是简单工厂模式的核心,它负责实现创建所有具体产品类的实例。
工厂类可以被外界直接调用,创建所需的产品对象。
b、Product(抽象产品角色)
是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。
c、ConcreteProduct(具体产品角色)
继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。
工厂类返回的都是该角色的某一具体产品。
6.1简单工厂模式实例:
使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,每个几何图形都要绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。
6.1.1代码分析
6.1.1.1Product(Shape抽象类)代码:
importjava.awt.Graphics;
importjavax.swing.JPanel;
publicabstractclassAbstractShape{
staticGraphicsg;
publicabstractvoiddraw(JPanelp);
publicabstractJPanelerase(JPanelp);
}
分析:
创建draw()和erase()方法供子类继承调用;
6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao具体产品类)代码:
//各个产品类代码类似、需要添加产品类时只需要另外创建一个类然后再修改工厂类少量代码即可
JuXing类:
importjavax.swing.JPanel;
//绘制矩形
publicclassJuXingextendsAbstractShape{
privateJPanelp;
Override
publicvoiddraw(JPanelp){
//TODOAuto-generatedmethodstub
this.p=p;//
g.drawrect(50,50,100,50);
}
Override
publicJPanelerase(JPanelp){
p.repaint();
//TODOAuto-generatedmethodstub
returnp;
}
}
YuanXing类:
importjavax.swing.JPanel;
//绘制圆形
publicclassYuanXingextendsAbstractShape{
privateJPanelp;
Override
publicvoiddraw(JPanelp){
//TODOAuto-generatedmethodstub
this.p=p;//
g.drawOval(50,50,50,50);
}
Override
publicJPanelerase(JPanelp){
p.repaint();
//TODOAuto-generatedmethodstub
returnp;
}
}
SanJiao类:
importjavax.swing.JPanel;
//绘制三角形
publicclassSanJiaoextendsAbstractShape{
privateJPanelp;
Override
publicvoiddraw(JPanelp){
//TODOAuto-generatedmethodstub
this.p=p;//
intx[]={130,100,200}
inty[]={130,200,200};
g.drawPolygon(x,y,3);}
Override
publicJPanelerase(JPanelp){
p.repaint();
//TODOAuto-generatedmethodstub
returnp;
}
}
6.1.1.3Factory(Factory类)代码:
publicclassFactory{
publicstaticAbstractShapecreatShape(Strings)throwsException{
if(s.equalsIgnoreCase("矩形")){
returnnewJuXing();
}
elseif(s.equalsIgnoreCase("圆形")){
returnnewYuanXing();
}
elseif(s.equalsIgnoreCase("三角形")){
returnnewSanJiao();
}
else{
thrownewException("UnSupportedShapeException");
}
}
}
//注释:
用于创建各个具体产品角色的对象;
6.1.1.4(main类):
创建一个窗体,添加控件和监听
代码如下:
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
publicclassShapeFrameextendsJFrameimplementsActionListener{
JPanelcontentPane=newJPanel();
JPanelupPane=newJPanel();
JPanelcenterPane=newJPanel();
StringshapeStr[]={"圆形","矩形","三角形"};
JComboBoxcmb=newJComboBox(shapeStr);
JLabellab=newJLabel("选择目标图形:
");
JButtondrawBtu=newJButton("绘制");
JButtoneraseBtu=newJButton("擦除");
Shapeshape;
ShapeFrame(Stringtitle){
super(title);
setSize(800,600);
setLocationRelativeTo(null);
addPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
voidaddPane(){
setContentPane(contentPane);
contentPane.setLayout(newBorderLayout());
contentPane.setBackground(Color.white);
upPane.setBackground(Color.white);
centerPane.setBackground(Color.white);
contentPane.add(upPane,BorderLayout.NORTH);
contentPane.add(centerPane,BorderLayout.CENTER);
initWidget();
upPane.add(lab);
upPane.add(cmb);
upPane.add(drawBtu);
upPane.add(eraseBtu);
}
voidinitWidget(){
drawBtu.addActionListener(this);
eraseBtu.addActionListener(this);
}
//关键代码
Override
publicvoidactionPerformed(ActionEvente){
Objectobject=e.getSource();
if(object.equals(drawBtu)){
StringshapeName=cmb.getSelectedItem().toString();
try{
shape=ShapeFactory.creatShape(shapeName);
shape.draw(centerPane);
}catch(Exceptionerror){
error.printStackTrace();
}
}elseif(object.equals(eraseBtu)){
if(shape!
=null){
JPanelnewPanel=shape.erase(centerPane);
contentPane.add(newPanel,BorderLayout.CENTER);
repaint();
shape=null;
}
}
}
}
6.1.1.5运行结果:
7.1结论
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。
在实际运用中,由于可行的系统都是比较复杂而且比较庞大的系统,用到的设计模式都比较复杂,而简单工厂设计模式是一个简单而且基础的设计模式,所以它会在较为复杂的设计模式中出现。
作为刚刚接触软件开发的初级技术人员,有必要了解和学习最基础的设计模式,这样才能在以后开发大型软件使用设计模式时灵活而且用法丰富多彩。
同时掌握基础的简单工厂设计模式有利于增强初学者对软件开发的认识和了解。
8.1参考文献:
【1】伟,胡志刚,郭克华《设计模式》:
清华大学2011年10月第一版。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 简单 工厂