-2

I am studying the Factory pattern and I have some doubts about which is the best way to buil it. I developed two progamas that do exactly the same, the only difference is the code that implements the pattern in question. After comparison could help me find:

  1. Code which one is better for reusability, for the JVM, for performance, etc, number 1 or 2?
  2. Is a 3.er optimal way to do even more?

Shared Classes

Artist

    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);

}
}

Track

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);

    }
}

Album

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);

    }
}

Case 1
Main Class

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();
            }
        });

    }
}

Factory Class public abstract class AbstractFactoryJInternalFrame extends 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();
}

Case 2
Main Class

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();
            }
        });

    }
}

Factory Class

    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();
}
tckmn
  • 57,719
  • 27
  • 114
  • 156

1 Answers1

0

In fact, your case#2 doesn't seem to be a "factory" since you are using the operator new to create your instances. In the other hand, case#1 seems to be correct, but I don't know what getFrame(..) does because the code isn't posted.

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

Anyway, you should check this link Factory Pattern

psabbate
  • 767
  • 1
  • 5
  • 22
  • getFrame() method is for specific crud action on Artist, Album and Track – Diego Rodriguez Mar 04 '13 at 14:03
  • it may not be a 100% factory but what is your answer to question 1 – Diego Rodriguez Mar 04 '13 at 14:07
  • Since is a desktop application, I don't think that you should worry about the performance. (if you are worry about this, please let us know your non functional requirements) Regarding the reusability, It's always helpful to think about the changes. what could possibly change?, and how the code would be impacted by these changes?. So definitely use case#1. Anyway, as I said before, you should take a look to the provided link. – psabbate Mar 04 '13 at 15:23
  • @DiegoRodriguez make sense to you? – psabbate Mar 04 '13 at 16:08