【问题标题】:Using Factory Pattern in Java在 Java 中使用工厂模式
【发布时间】:2013-03-04 13:24:23
【问题描述】:

我正在研究工厂模式,但我对构建它的最佳方式有些疑问。 我开发了两个完全相同的程序,唯一的区别是实现相关模式的代码。经过比较可以帮我找到:

  1. 代码在可重用性、JVM、性能等方面哪个更好,数字 1 还是 2?
  2. 3.er 是不是做更多事情的最佳方式?

共享课程

艺术家

    public class ArtistFrame extends AbstractFactoryJInternalFrame {

public ArtistFrame(String title, int x, int y) {
    super(title, x, y);
}

@Override
void makeButtons() {

    JButton addBtn = new JButton("Add");
    addBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            //to do
        }
    });

    JButton saveBtn = new JButton("Save");
    saveBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            //to do
        }
    });

    JButton deleteBtn = new JButton("Delete");
    deleteBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            //to do
        }
    });

    JButton cancelBtn = new JButton("Cancel");
    cancelBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            //to do
        }
    });

    add(addBtn, BorderLayout.SOUTH);
    add(saveBtn, BorderLayout.NORTH);
    add(deleteBtn, BorderLayout.EAST);
    add(cancelBtn, BorderLayout.WEST);

}
}

跟踪

public class TrackFrame extends AbstractFactoryJInternalFrame {

    public TrackFrame(String title, int x, int y) {
        super(title, x, y);

    }

    @Override
    void makeButtons() {

        JButton addBtn = new JButton("Add");
        addBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        JButton saveBtn = new JButton("Save");
        saveBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        JButton deleteBtn = new JButton("Delete");
        deleteBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        JButton cancelBtn = new JButton("Cancel");
        cancelBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        add(addBtn, BorderLayout.NORTH);
        add(saveBtn, BorderLayout.CENTER);
        add(deleteBtn, BorderLayout.EAST);
        add(cancelBtn,BorderLayout.WEST);

    }
}

专辑

public class AlbumFrame extends AbstractFactoryJInternalFrame {

    public AlbumFrame(String title, int x, int y) {
        super(title, x, y);

    }

    @Override
    void makeButtons() {

        JButton addBtn = new JButton("Add");
        addBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        JButton saveBtn = new JButton("Save");
        saveBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        JButton deleteBtn = new JButton("Delete");
        deleteBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        JButton cancelBtn = new JButton("Cancel");
        cancelBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //to do
            }
        });

        add(addBtn, BorderLayout.EAST);
        add(saveBtn, BorderLayout.WEST);
        add(deleteBtn, BorderLayout.NORTH);
        add(cancelBtn, BorderLayout.SOUTH);

    }
}

案例 1
主类

public class TestSwing extends JFrame {

    JDesktopPane desktop;
    AbstractFactoryJInternalFrame artistFrame;
    AbstractFactoryJInternalFrame albumFrame;
    AbstractFactoryJInternalFrame trackFrame;

    public TestSwing() {

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(500,300);

        desktop = new JDesktopPane();

        artistFrame = AbstractFactoryJInternalFrame.getFrame("Artist",10,10);
        albumFrame = AbstractFactoryJInternalFrame.getFrame("Album", 20, 20);
        trackFrame = AbstractFactoryJInternalFrame.getFrame("Track", 30,30);

        desktop.add(artistFrame);
        desktop.add(albumFrame);
        desktop.add(trackFrame);

        setContentPane(desktop);

        setVisible(true);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestSwing ts = new TestSwing();
            }
        });

    }
}

工厂类 公共抽象类 AbstractFactoryJInternalFrame 扩展 JInternalFrame {

protected AbstractFactoryJInternalFrame(String title, int x, int y) {
    super(title, true, true, true, true);
    setLocation(y,y);

}

public static AbstractFactoryJInternalFrame getFrame(String title, int x, int y) {

    AbstractFactoryJInternalFrame frame = null;

    if (title.equals("Artist")) {
        frame = new ArtistFrame(title, x, y);

    } else if (title.equals("Album")) {
        frame = new AlbumFrame(title, x, y);

    } else {
        frame = new TrackFrame(title, x, y);
    }

    frame.makeButtons();
    frame.pack();
    frame.setVisible(true);

    return frame;

}

abstract void makeButtons();
}

案例 2
主类

public class TestSwing extends JFrame {

    JDesktopPane desktop;

    AbstractFactoryJInternalFrame artistFrame;
    AbstractFactoryJInternalFrame albumFrame;
    AbstractFactoryJInternalFrame trackFrame;

    public TestSwing() {

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(500,300);

        desktop = new JDesktopPane();

        artistFrame = new ArtistFrame("Arist",10,10);
        albumFrame = new AlbumFrame("Album", 20, 20);
        trackFrame = new TrackFrame("Track", 30,30);

        desktop.add(artistFrame);
        desktop.add(albumFrame);
        desktop.add(trackFrame);

        setContentPane(desktop);

        setVisible(true);
    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestSwing ts = new TestSwing();
            }
        });

    }
}

工厂类

    public abstract class AbstractFactoryJInternalFrame extends JInternalFrame {

protected AbstractFactoryJInternalFrame(String title, int x, int y) {
    super(title, true, true, true, true);
    setLocation(y,y);
    makeButtons();
    pack();
    setVisible(true);


}

abstract void makeButtons();
}

【问题讨论】:

  • 代码太多了。请发帖SSCCE。
  • 在 todo 中对每个对象进行特定的 crud 操作。下次想太多代码了
  • 这只是一个例子,但它是生产版本的堆栈
  • 您需要学习如何使用简洁的代码更简洁地构建您的问题。 99% 的人会看代码而忽略问题。

标签: java swing design-patterns factory-pattern


【解决方案1】:

事实上,您的案例#2 似乎不是“工厂”,因为您正在使用运算符 new 来创建实例。 另一方面,case#1 似乎是正确的,但我不知道 getFrame(..) 做了什么,因为代码没有发布。

 artistFrame = AbstractFactoryJInternalFrame.getFrame("Artist",10,10);

无论如何,你应该检查这个链接Factory Pattern

【讨论】:

  • getFrame() 方法用于对艺术家、专辑和曲目进行特定的 crud 操作
  • 它可能不是 100% 的工厂,但你对问题 1 的回答是什么
  • 既然是桌面应用程序,我认为您不必担心性能问题。 (如果您对此感到担心,请告诉我们您的非功能性要求) 关于可重用性,考虑更改总是有帮助的。可能会发生什么变化?以及代码将如何受到这些变化的影响?所以绝对是用例#1。无论如何,正如我之前所说,您应该查看提供的链接。
  • @DiegoRodriguez 对你有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多