1、简单工厂设计模式目录1.1 摘要 22.1 关键字 23.1 开发工具 24.1 简单工厂模式动机与定义: 24.1.1 模式动机 .24.1.2 模式定义 .25.1 简单工厂模式结构 36.1 简单工厂模式实例: 46.1.1 代码分析 .46.1.1.1Product(Shape 抽象类)代码: .46.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao 具体产品类)代码: .5JuXing 类: .5YuanXing 类: 6SanJiao 类: 66.1.1.3Factory(Factory 类)代码: 76.1.1.4 (main 类): 76
2、.1.1.5 运行结果: 107.1 结论 108.1 参考文献: 101.1 摘要本文从面向对象的角度对 java 接口的概念、作用以及使用它的好处做分析,讲解面向接口编程的方法,结合初步接触 软件开发的人员习惯,从 简单 工厂设计模式的概念和其结构以及用途进行解析,重点讲解简单 工厂设计模式在软件开发过 程中的作用和好处,通 过一些实例来说明简单工厂设计模式的特点。 2.1 关键字面向对象;java 接口;接口编程;简单工厂设计模式。3.1 开发工具Eclipse java 语言开发4.1 简单工厂模式动机与定义:在实际的软件开发过程中有时需要创建一些来自于相同父类的类的实例,为此可以专门
3、定义一个类来负责创建这些类的实例, 这些被创建的实 例具有共同的父类。在 这种情况下,可以通过传入不同的参数从而获取不同的对象,理由 Java 语言的特征,习惯上将创建其他类实例的方法定义为 static 方法,外部不需要 实例化这个类 就可以直接调用该方法来获得需要的对象,该方法也成为静态 工厂方法。4.1.1 模式动机考虑一个简单的软件应用场景,一个 软件系统可以提供多个外 观不同的按钮(如圆形按钮,矩形按钮等),这些按钮都源自同一个基 类,不 过在继承基 类之后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我 们希望在使用 这些按钮时,不需要知道 这些具体按钮类的名字,只需
4、要知道表示 该按钮的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此 时,就可以使用简单工厂模式。4.1.2 模式定义简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。5.1 简单工厂模式结构a、Factory(工厂角色)是简单工厂模式的核心,它负责实现创 建所有具体产品类 的实例。工厂 类可以被外界直接调用,创建所需的产品 对象。b、Product(抽象产品角色)是所有具体产品角色的父类,它 负责描述所有实例所共有的公共接口。c、ConcreteProduct(具体产品角色)继承自抽象产品角色,一般 为多个,是 简单工厂模式的
5、 创建目标。工厂类返回的都是该角色的某一具体产品。6.1 简单工厂模式实例:使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,每个几何图形都要 绘制 draw()和擦除 erase()两个方法,要求在绘制不支持的几何图形时,提示一个 UnSupportedShapeException。6.1.1 代码分析6.1.1.1Product(Shape 抽象类)代码:import java.awt.Graphics;import javax.swing.JPanel;public abstract class AbstractShape static Graphics
6、g;public abstract void draw(JPanel p);public abstract JPanel erase(JPanel p);分析:创建draw()和erase()方法供子类继承调用;6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao 具体产品类)代码:/各个产品类代码类似、需要添加产品类时只需要另外创建一个类然后再修改工厂类少量代码即可JuXing 类:import javax.swing.JPanel;/绘 制矩形public class JuXing extends AbstractShape private JPan
7、el p; Overridepublic void draw(JPanel p) / TODO Auto-generated method stubthis.p=p;/g.drawrect(50, 50, 100, 50);Overridepublic JPanel erase(JPanel p) p.repaint();/ TODO Auto-generated method stubreturn p;YuanXing 类:import javax.swing.JPanel;/绘 制圆形public class YuanXing extends AbstractShape private J
8、Panel p; Overridepublic void draw(JPanel p) / TODO Auto-generated method stubthis.p=p;/g.drawOval(50, 50, 50, 50);Overridepublic JPanel erase(JPanel p) p.repaint();/ TODO Auto-generated method stubreturn p;SanJiao 类 :import javax.swing.JPanel;/绘 制三角形public class SanJiao extends AbstractShape private
9、 JPanel p; Overridepublic void draw(JPanel p) / TODO Auto-generated method stubthis.p=p;/int x=130,100,200int y=130,200,200;g.drawPolygon(x, y, 3); Overridepublic JPanel erase(JPanel p) p.repaint();/ TODO Auto-generated method stubreturn p;6.1.1.3Factory(Factory 类) 代码:public class Factory public sta
10、tic AbstractShape creatShape(String s) throws Exceptionif(s.equalsIgnoreCase(“矩形“)return new JuXing();else if(s.equalsIgnoreCase(“圆形“)return new YuanXing();else if(s.equalsIgnoreCase(“三角形“)return new SanJiao();else throw new Exception(“UnSupportedShapeException“);/注释:用于创建各个具体产品角色的对象;6.1.1.4 (main 类)
11、:创建一个窗体,添加控件和监 听代码如下:import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class ShapeFrame extends JFrame implements ActionListener JPanel contentPane = new JPanel();JPanel upPane = new JPanel();JPanel centerPane = new JPanel();String s
12、hapeStr = “圆形“ ,“矩形“, “三角形“ ;JComboBox cmb = new JComboBox(shapeStr);JLabel lab = new JLabel(“选择目标图形:“);JButton drawBtu = new JButton(“绘制“ );JButton eraseBtu = new JButton(“擦除“);Shape shape;ShapeFrame(String title) super(title);setSize(800,600);setLocationRelativeTo(null);addPane();setDefaultCloseOp
13、eration(JFrame.EXIT_ON_CLOSE);void addPane() setContentPane(contentPane);contentPane.setLayout(new BorderLayout();contentPane.setBackground(Color.white);upPane.setBackground(Color.white);centerPane.setBackground(Color.white);contentPane.add(upPane,BorderLayout.NORTH);contentPane.add(centerPane,Borde
14、rLayout.CENTER);initWidget();upPane.add(lab);upPane.add(cmb);upPane.add(drawBtu);upPane.add(eraseBtu);void initWidget() drawBtu.addActionListener(this);eraseBtu.addActionListener(this);/关 键代码Overridepublic void actionPerformed(ActionEvent e) Object object = e.getSource();if (object.equals(drawBtu) S
15、tring shapeName = cmb.getSelectedItem().toString();tryshape = ShapeFactory.creatShape(shapeName);shape.draw(centerPane);catch (Exception error)error.printStackTrace(); else if (object.equals(eraseBtu) if (shape != null) JPanel newPanel = shape.erase(centerPane);contentPane.add(newPanel, BorderLayout
16、.CENTER);repaint();shape = null;6.1.1.5 运行结果:7.1 结论简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。在实际运用中,由于可行的系统都是比较复杂而且比 较庞大的系统,用到的设计模式都比较复杂,而简单工厂 设计模式是一个简单而且基 础的设计模式,所以它会在 较为复杂的设计模式中出现。作为刚刚 接触软件开发的初级技术 人员,有必要了解和学 习最基础的设计模式,这样才能在以后开 发大型软件使用设计模式时 灵活而且用法丰富多彩。同 时掌握基础的简单工厂设计模式有利于增强初学者对软件开发的认识和了解。8.1 参考文献:【1】刘伟,胡志刚,郭克华设计模式北京:清华大学出版社 2011 年 10 月第一版。