1. 程式人生 > >設計模式學習系列二:工廠模式

設計模式學習系列二:工廠模式

工廠模式

工廠模式實際上是包含了三類:

  1. 簡單工廠
  2. 工廠方法
  3. 抽象工廠
  • 簡單工廠是一個工廠生產某一類產品;
  • 工廠方法是用多個工廠來生產某一類產品;
  • 抽象工廠就是用多個工廠來生產多類產品;

這三種模式實際上都是屬於建立型的模式,從上至下依次變得複雜。

 簡單工廠

 工廠方法

工廠方法模式(Factory Method)將程式中建立物件的操作,單獨出來處理,建立一個產品的工廠介面,把實際的工作轉移到具體的子類。大大提高了系統擴充套件的柔性,介面的抽象化處理給相互依賴的物件建立提供了最好的抽象模式。

public class TestFactoryMethod {

public static void main(String[] args) {

AnimalFactory af=new DogFactory();

Animal1 a=af.getAnimal();

}

}

abstract class Animal1{}

class Dog1 extends Animal1{}

class Cat1 extends Animal1{}



abstract class AnimalFactory{

public abstract Animal1 getAnimal();

}

class DogFactory extends AnimalFactory{

public Animal1 getAnimal(){

System.out.println("Dog");

return new Dog1();

}

}

class CatFactory extends AnimalFactory{

public Animal1 getAnimal(){

System.out.println("Cat");

return new Cat1();

}

} 

抽象工廠

抽象工廠模式(Abstract Factory) 針對多個產品等級的情況,而工廠方法模式針對單一產品等級的情況。

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class TestAbstractFactory {

public static void main(String[] args) {

GUIFactory fact=new SwingFactory();

Frame f=fact.getFrame();

Component c1=fact.getButton();

Component c2=fact.getTextField();



f.setSize(500,300);

f.setLayout(new FlowLayout());

f.add(c1);

f.add(c2);

f.setVisible(true);



f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

}

}

abstract class GUIFactory{

public abstract Component getButton();

public abstract Component getTextField();

public abstract Frame getFrame();

}

class AWTFactory extends GUIFactory{

public Component getButton() {

return new Button("AWT Button");

}

public Frame getFrame() {

return new Frame("AWT Frame");

}

public Component getTextField() {

return new TextField(20);

}



}

class SwingFactory extends GUIFactory{

public Component getButton() {

return new JButton("Swing Button");

}

public Frame getFrame() {

return new JFrame("Swing Frame");

}

public Component getTextField() {

return new JTextField(20);

}

}