利用实例来了解该模式
房屋销售查询系统-抽象工厂模式
一、工厂类
1、建筑工厂抽象类(BuildingFactory)
public abstract class BuildingFactory {
public static final String SUPER = "Super Class";
public static final String MEDIUM = "Medium Class";
public static final String LOW = "Low Class";
public abstract House getHouse();
public abstract Condo getCondo();
public static BuildingFactory getBuildFactory(String type){
BuildingFactory bf = null;
//确定具体的工厂子类对象
if(type.equals(BuildingFactory.SUPER)){bf = new SuperBuildingFactory();}
else if (type.equals(BuildingFactory.MEDIUM)){bf = new MediumBuildingFactory();}
else if (type.equals(BuildingFactory.LOW)){bf = new LowBuildingFactory();}
return bf;
}
}
2、高级建筑工厂类(SuperBuildingFactory)
public class SuperBuildingFactory extends BuildingFactory{
@Override
public House getHouse() {
return new SuperHouse();
}
@Override
public Condo getCondo() {
return new SuperCondo();
}
}
3、中级建筑工厂类(MediumBuildingFactory)
public class MediumBuildingFactory extends BuildingFactory{
@Override
public House getHouse() {
return new MediumHouse();
}
@Override
public Condo getCondo() {
return new MediumCondo();
}
}
4、低级建筑工厂类(LowBuildingFactory)
public class LowBuildingFactory extends BuildingFactory{
@Override
public House getHouse() {
return new LowHouse();
}
@Override
public Condo getCondo() {
return new LowCondo();
}
}
二、House 系列
1、接口(House)
public interface House {
public String getHouseInfo();
}
2、子类(LowHouse)
public class LowHouse implements House{
@Override
public String getHouseInfo() {
return "lowHouse.html";
}
}
3、子类(MediumHouse)
public class MediumHouse implements House{
@Override
public String getHouseInfo() {
return "mediumHouse.html";
}
}
4、子类(SuperHouse)
public class SuperHouse implements House{
@Override
public String getHouseInfo() {
return "superHouse.html";
}
}
三、Condo 系列
1、接口(Condo)
public interface Condo {
public String getCondoInfo();
}
2、子类(LowCondo)
public class LowCondo implements Condo{
@Override
public String getCondoInfo() {
return "lowCondo.html";
}
}
3、子类(MediumCondo)
public class MediumCondo implements Condo{
@Override
public String getCondoInfo() {
return "mediumCondo.html";
}
}
4、子类(SuperCondo)
public class SuperCondo implements Condo{
@Override
public String getCondoInfo() {
return "superCondo.html";
}
}
四、GUI
只是简单的生成界面
public class AbstractFactoryGUI extends JFrame {
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent ae) {
if(ae.getActionCommand().equals(AbstractFactoryGUI.SEARCH)){
//获得房屋类型和种类
String classHouse = (String) cmbHouseClass.getSelectedItem(); //中等 超级
String type = (String) cmbHouseType.getSelectedItem(); //公寓 别墅
//获得具体的工厂子类对象
//通过传入的类型进行判断
BuildingFactory bf = BuildingFactory.getBuildFactory(classHouse);
//获得具体的House对象 或者 Condo 对象
if(type.equals(AbstractFactoryGUI.HOUSE)){
House hs = bf.getHouse();
String fileNm = hs.getHouseInfo();
txtArea.append(fileNm);
} else if (type.equals(AbstractFactoryGUI.CONDO)) {
Condo cd = bf.getCondo();
String fileNm = cd.getCondoInfo();
txtArea.append(fileNm);
}
}
}
}
JFrame jFrame = new JFrame("房屋销售系统");
JPanel jPanel = new JPanel();
//下拉选择框
JComboBox cmbHouseClass = new JComboBox();
JComboBox cmbHouseType = new JComboBox();
//文本域
JTextArea txtArea = new JTextArea(6,30);
//按钮
JButton btn = new JButton("点击这个按扭");
//按钮的监听对象
ButtonListener buttonListener = new ButtonListener();
static final String SEARCH = "点击这个按扭";
static final String HOUSE = "house";
static final String CONDO = "condo";
public void init(){
cmbHouseClass.addItem("Super Class");
cmbHouseClass.addItem("Medium Class");
cmbHouseClass.addItem("Low Class");
cmbHouseType.addItem("house");
cmbHouseType.addItem("condo");
btn.addActionListener(buttonListener);
jPanel.add(cmbHouseClass);
jPanel.add(cmbHouseType);
jPanel.add(btn);
jFrame.add(jPanel);
jFrame.add(txtArea, BorderLayout.SOUTH);
jFrame.setVisible(true);
jFrame.pack();
}
}
五、添加一个房屋的种类(高、中、低...)
1、先创建房屋种类house condo接口的子类
2、在创建房屋类型(BuildingFactory)的工厂子类(lowBuildFactory)
3、再修改房屋类型(BuildingFactory)
(1)添加一个字符串常量 LOW
(2)添加else-if语句
4、修改GUI :cmbHouseClass 添加一个选项Low Class
六、添加一个房屋的类型(House、Condo...)
和 五 差不多但不一样,这个需要创建一个新的接口
七、简单、工厂、抽象 在结构上的一些区别
简单: 一个工厂类 直接对应 一个产品类的所有子类 1 * n
工厂: 一个工厂类的每一个子类 与 一个产品类的每一个子类一一对应 n * n
抽象: 一个工厂类的每一个子类 与 多个产品类的所有子类 对应 n * (n * n)