简单工厂设计模式目录1.1摘要 (2)2.1关键字 (2)3.1开发工具 (2)4.1简单工厂模式动机与定义: (3)4.1.1模式动机 (3)4.1.2模式定义 (3)5.1简单工厂模式结构 (4)6.1简单工厂模式实例: (5)6.1.1代码分析 (6)6.1.1.1Product(Shape抽象类)代码: (6)6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao具体产品类)代码:.. 7JuXing类: (7)YuanXing类: (8)SanJiao类: (8)6.1.1.3Factory(Factory类)代码: (9)6.1.1.4 (main类): (10)6.1.1.5运行结果: (12)7.1结论 (12)8.1参考文献: (13)1.1摘要本文从面向对象的角度对java接口的概念、作用以及使用它的好处做分析,讲解面向接口编程的方法,结合初步接触软件开发的人员习惯,从简单工厂设计模式的概念和其结构以及用途进行解析,重点讲解简单工厂设计模式在软件开发过程中的作用和好处,通过一些实例来说明简单工厂设计模式的特点。
2.1关键字面向对象;java接口;接口编程;简单工厂设计模式。
3.1开发工具Eclipse java语言开发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抽象类)代码:import java.awt.Graphics;import javax.swing.JPanel;publicabstractclass AbstractShape { static Graphics g;publicabstractvoid draw(JPanel p);publicabstract JPanel erase(JPanel p); }分析:创建draw()和erase()方法供子类继承调用;6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao具体产品类)代码://各个产品类代码类似、需要添加产品类时只需要另外创建一个类然后再修改工厂类少量代码即可JuXing类:import javax.swing.JPanel;//绘制矩形publicclass JuXing extends AbstractShape {private JPanel p;@Overridepublicvoid 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;//绘制圆形publicclass YuanXing extends AbstractShape { private JPanel p;@Overridepublicvoid 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;//绘制三角形publicclass SanJiao extends AbstractShape { private JPanel p;@Overridepublicvoid draw(JPanel p) {// TODO Auto-generated method stubthis.p=p;//int x[]={130,100,200}int 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类)代码:publicclass Factory {publicstatic AbstractShapecreatShape(String s) throws Exception{ if(s.equalsIgnoreCase("矩形")){returnnew JuXing();}elseif(s.equalsIgnoreCase("圆形")){returnnew YuanXing();}elseif(s.equalsIgnoreCase("三角形")){returnnew SanJiao();}else {thrownew Exception("UnSupportedShapeException");}}}//注释:用于创建各个具体产品角色的对象;6.1.1.4 (main类):创建一个窗体,添加控件和监听代码如下:import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;publicclass ShapeFrame extends JFrame implements ActionListener { JPanel contentPane = new JPanel();JPanel upPane = new JPanel();JPanel centerPane = new JPanel();String shapeStr[] = {"圆形","矩形","三角形"};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();setDefaultCloseOperation(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,BorderLayout.CENTER);initWidget();upPane.add(lab);upPane.add(cmb);upPane.add(drawBtu);upPane.add(eraseBtu);}void initWidget() {drawBtu.addActionListener(this);eraseBtu.addActionListener(this);}//关键代码@Overridepublicvoid actionPerformed(ActionEvent e) {Object object = e.getSource();if (object.equals(drawBtu)) {String shapeName = cmb.getSelectedItem().toString(); try{shape = ShapeFactory.creatShape(shapeName);shape.draw(centerPane);}catch (Exception error){error.printStackTrace();}} elseif (object.equals(eraseBtu)) {if (shape != null) {JPanel newPanel = shape.erase(centerPane);contentPane.add(newPanel, BorderLayout.CENTER);repaint();shape = null;}}}}6.1.1.5运行结果:7.1结论简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。