利用实例来了解该模式
汽车保险管理程序-工厂方法模式
一、工厂类
1、基类(接口)
public interface PolicyProducer {
public AutoInsurance getInsurObj() ;
}
2、子类(具体的工厂子类)
(1)BodyPolicy
public class BodyPolicy implements PolicyProducer {
@Override
public AutoInsurance getInsurObj() {
return new BodyInjur();
}
}
(2)CollPolicy
public class CollPolicy implements PolicyProducer{
@Override
public AutoInsurance getInsurObj() {
return new Collision();
}
}
(3)ComPolicy
public class ComPolicy implements PolicyProducer{
@Override
public AutoInsurance getInsurObj() {
return new ComCover();
}
}
二、产品类
1、基类(接口)
public class BodyPolicy implements PolicyProducer {
@Override
public AutoInsurance getInsurObj() {
return new BodyInjur();
}
}
2、子类(具体的产品子类)
(1)BodyInjur
public class BodyInjur implements AutoInsurance {
private String description;
@Override
public String getInfo() { //描述保险的具体细节代码,返回代表描述的字符串
description = "bodyinjure0001";
return description;
}
}
(2)Collision
public class Collision implements AutoInsurance{
private String description;
@Override
public String getInfo() {
description = "collision0001";
return description;
}
}
(3)ComCover
public class ComCover implements AutoInsurance{
private String description;
@Override
public String getInfo() {
description = "comprehesive0001";
return description;
}
}
三、用户界面GUI
只是简单的生成界面
public class ClientGUI extends JFrame {
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent ae) {
if(ae.getActionCommand().equals(SHOW)){
String type = (String) cmbInsuranceType.getSelectedItem();
PolicyProducer pp = null;
//创建工厂子类的对象 pp
if(type.equals(BODYINJURE)){ pp = new BodyPolicy();}
else if (type.equals(COLLISION)) { pp = new CollPolicy(); }
else if (type.equals(COMPREHENSIVE)) { pp = new ComPolicy(); }
//调用工厂方法,获得一个具体的产品子类对象
AutoInsurance ai = pp.getInsurObj();
//使用该产品子类对象做相应的操作
String desc = ai.getInfo();
txtForInfo.setText(desc);
}
}
}
JFrame jFrame = new JFrame("工厂方法模式-汽车保险管理");
JPanel jPanel = new JPanel();
//文本域
JTextArea txtForInfo = new JTextArea(6,30);
//用于逻辑判断的几个字符串常量
final String SHOW = "点击这个按钮";
final String BODYINJURE = "bodyinjure";
final String COLLISION = "collision";
final String PROPERTY = "property";
final String COMPREHENSIVE = "comprehesive";
//下拉选择框
JComboBox cmbInsuranceType = new JComboBox();
//按钮
JButton btn = new JButton("点击这个按钮");
ButtonListener buttonListener = new ButtonListener();
public void init(){
//下拉选择框的选项
cmbInsuranceType.addItem("bodyinjure");
cmbInsuranceType.addItem("collision");
//cmbInsuranceType.addItem("property");
cmbInsuranceType.addItem("comprehesive");
btn.addActionListener(buttonListener);
jPanel.add(cmbInsuranceType);
jPanel.add(btn);
jFrame.add(jPanel);
jFrame.add(txtForInfo, BorderLayout.SOUTH);
jFrame.setVisible(true);
jFrame.pack();
}
}
四、添加一个新的子类的步骤
1、添加一个新的工厂子类(返回产品子类对象)
2、添加一个新的产品子类
3、修改用户界面GUI
(1)类 ButtonListener 添加一个else-if
(2)添加一个 字符串常量 和 下拉选择框的选项
五、在以下任何一种情况下,可以使用工厂方法模式。
(1)创建某些类的对象的逻辑比较复杂,并且有很多条件分支,而且还可能增加新的条件。
(2)一个类不能预先准确地知道它必须创建一个层次类中哪个子类的对象。
(3)一个类使用它的子类决定所要创建的对象。
(4)需要封装创建类的对象的逻辑,使得这些逻辑局部化。
六、工厂方法模式的优点如下
(1)工厂方法模式将创建对象的逻辑与任务交给了工厂类。
(2)工厂方法模式支持开闭原则。