文章目录
- 前言
- 一、简单工厂模式简介
- 二、简单工厂模式解析
- 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比较简陋,主要是为了学习设计模式
最后
源代码我都上传到github上了有需要的可以去看看
链接:https://github.com/jianqiang-Zhang/DesignPattern
总结
简单工厂模式是工厂模式中逻辑最简单,同时也是最容易实现的一种模式。但是其缺点也十分明显,那就是当需要增加需求时,例如需要画一个三角形时,就需要增加一个类的同时修改ShapeFactory类中的代码。