文章目录

  • 前言
  • 一、简单工厂模式简介
  • 二、简单工厂模式解析
  • 1.Shape接口
  • 2.类Rectangle、Square、Round
  • 3.类ShapeFactory
  • 4.类User
  • 5.运行图
  • 最后
  • 总结



前言

本文通过java语言,以简单工厂模式实现不同图形的绘制同时使用了JFrame实现GUI(由于对JAVA的使用还在学习阶段,所以GUI界面会略显粗糙)


一、简单工厂模式简介

简单工厂模式又叫做静态工厂方法模式,它属于创建型模式。
	在简单工厂模式中,可以根据参数的不同返回不同类的实例。
	简单工厂模式专门定义一个类来负责创建其他类的实例。
	被创建的实例通常都具有共同的父类。

其类图如下所示


«Inerface» Shape draw() «enum» Type Rectangle Square Round Rectangle +draw() Square +draw() Round +draw() ShapeFactory +getShape(Type) User ShapeFacotry fac +main() : void


二、简单工厂模式解析

1.Shape接口

该接口提供一个draw()方法,所有子类继承该接口都会重写该方法。不同的子类,对该方法的实现就有所不同。

代码如下:

public interface Shape {
	void draw();
}

2.类Rectangle、Square、Round

这三个类继承上述接口,每个类都会实现各自的draw方法。同时为了实现简单的GUI,该类还会对类JFrame进行继承。

Rectangle代码如下:

import javax.swing.*;
import java.awt.*;

public class Rectangle extends JFrame implements  Shape{
    public void draw() {
        this.pack();
        this.setTitle("画矩形");
        this.setSize(300,200);
        this.setResizable(false);
        this.setVisible(true);
    }

    public void paint(Graphics g){
        //this.setSize(300,200);
        g.drawRect(120,60,100,30);
    }
}

Square代码如下:

import javax.swing.*;
import java.awt.*;

public class Square extends JFrame implements Shape{
    @Override
    public void draw() {
        this.pack();
        this.setTitle("正方形");
        this.setSize(300,200);
        this.setResizable(false);
        this.setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        g.drawRect(150,100,50,50);
    }
}

Round代码如下:

import javax.swing.*;
import java.awt.*;

public class Round extends JFrame implements Shape {
    @Override
    public void draw() {
        this.pack();
        this.setTitle("Round");
        this.setSize(300,200);
        this.setResizable(false);
        this.setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        g.drawOval(150,100,30,30);
    }
}

3.类ShapeFactory

该类就是生产图形的工厂,通过方法getShape()能够得到一个Shape类型的实例。通过该方法传入的参数就可以获得不同子类的实例

ShapeFactory代码如下:

public class ShapeFactory {
    public Shape getShape(Type shapeType) {
        switch (shapeType) {
            case Round ->{
                return new Round();
            }
            case Rectangle ->{
                return new Rectangle();
            }
            case Square -> {
                return new Square();
            }
            default -> {
                return null;
            }
        }
    }
}

4.类User

这个类就是用户类,该类提出画出某种类型图形的请求。例如当该类选择画一个圆形时,该类中的一个ShapeFactory的实例就会以相应的参数调用getShape()方法。
(ps:参数使用上面类图中使用到的枚举型中的值)
通过调用getShape方法产生的实例再调用darw方法就能够实现画出一个圆的操作啦。
当然这里对画什么进行选择使用的是一个comboBox和一个button


ShapeFactory代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class User extends JFrame {
    JComboBox comboBox;
    JButton button;
    SimpleFactory.Type a;
    ShapeFactory factory;
    JPanel panel;
    JLabel label;
    Shape shape;
    public void init(){
        factory = new ShapeFactory();

        label = new JLabel("画图形");
        label.setLocation(200,200);
        panel = new JPanel();
        comboBox = new JComboBox();
        button = new JButton("确定");
        comboBox.addItem("长方形");
        comboBox.addItem("正方形");
        comboBox.addItem("圆形");

        panel.add(comboBox);
        panel.add(button);
        this.add(label);
        this.add(panel);
        this.setLayout(new GridLayout(2,1));
        this.setTitle("画简单图形");
        this.setSize(500,300);
        this.setLocation(100,100);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.repaint();
        try {
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int index = comboBox.getSelectedIndex();
                    switch (index) {
                        case 0: {
                            a = SimpleFactory.Type.Rectangle;
                            shape = factory.getShape(a);
                            shape.draw();
                            break;
                        }
                        case 1: {
                            a = SimpleFactory.Type.Square;
                            shape = factory.getShape(a);
                            shape.draw();
                            break;
                        }
                        case 2: {
                            a = SimpleFactory.Type.Round;
                            shape = factory.getShape(a);
                            shape.draw();
                            break;
                        }
                        default: {
                            JOptionPane.showConfirmDialog(null, "请选择相应的图形", "错误", JOptionPane.ERROR_MESSAGE);
                            break;
                        }

                    }
                }
            });
        }catch (NullPointerException e){
            e.getMessage();
        }
    }
    public static void main(String[] args) {
        User user1 = new User();
        user1.init();
    }
}

5.运行图

GUI比较简陋,主要是为了学习设计模式

用java画一个矩形 java画一个正方形_gui


用java画一个矩形 java画一个正方形_简单工厂模式_02


用java画一个矩形 java画一个正方形_gui_03

最后

源代码我都上传到github上了有需要的可以去看看
链接:https://github.com/jianqiang-Zhang/DesignPattern


总结

简单工厂模式是工厂模式中逻辑最简单,同时也是最容易实现的一种模式。但是其缺点也十分明显,那就是当需要增加需求时,例如需要画一个三角形时,就需要增加一个类的同时修改ShapeFactory类中的代码。