抽象工厂模式实例

利用实例来了解该模式

房屋销售查询系统-抽象工厂模式

一、工厂类

        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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值