2013-03-04 4 views
-2

Я изучаю шаблон Factory, и у меня есть некоторые сомнения относительно того, какой из них является лучшим способом его создания. Я разработал две прогамы, которые делают точно то же самое, единственное отличие - это код, который реализует данный шаблон. После сравнения я могу найти:Использование Factory Pattern в Java

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

    } 
} 

Класс фабрики

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

Это является слишком много кода. Пожалуйста, опубликуйте [SSCCE] (http://sscce.org). – Doorknob

+0

в todo идут конкретные операции crud для каждого объекта. В следующий раз, когда я думаю о слишком большом коде –

+0

, это только и пример, но это стек для выпуска выпуска –

ответ

0

На самом деле, ваш случай # 2, кажется, не быть "фабрика", так как вы используете оператору новый для создания экземпляров , С другой стороны, случай # 1 кажется правильным, но я не знаю, что делает getFrame (..), потому что код не отправлен.

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

Во всяком случае, вы должны проверить эту ссылку Factory Pattern

+0

Метод getFrame() предназначен для конкретного крафт-действия на Artist, Album и Track –

+0

, он не может быть 100% -ой фабрикой, но каков ваш ответ на вопрос 1 –

+0

Поскольку это настольное приложение, я не думаю, что вам следует беспокоиться о представление.(если вы беспокоитесь об этом, сообщите нам ваши нефункциональные требования) Что касается повторного использования, всегда полезно подумать об изменениях. что могло бы измениться? »и как на этот код повлияют эти изменения ?. Так определенно используйте случай №1. В любом случае, как я уже говорил, вы должны взглянуть на предоставленную ссылку. – psabbate