解决问题类型
创建对象的代码时,需要设置许多条件语句,以便决定在什么条件下,何时、怎样创建某个类的对象,这样客户类变得比较臃肿,难以维护。
解决设计思路
讲创建对象的责任委托给某个特殊的类,工厂类
具体待解决的问题
设计一个汽车保险管理程序,通过知道所需的准确功能,从客户类的主方法中直接初始化类结构体中的某个子类。
UML设计
工厂模式
简单工程模式
核心代码
工厂方法模式
public interface FactoryInsurance {
public String getInfo();
}
class FBodyInjur implements FactoryInsurance
{
@Override
public String getInfo() {
return "选择了人身伤亡";
}
}
class FCollisin implements FactoryInsurance{}
class FPersonInjur implements FactoryInsurance{}
class FProperty implements FactoryInsurance{}
class FCom implements FactoryInsurance{}
简单工厂模式
public class SimpleFactory {
public static SimpleInsurance createInsurance(String option)
{
SimpleInsurance Insurance=null;
if(option.equals("人员伤亡")){Insurance= new BodyInjur();}
else if(option.equals("碰撞")){Insurance= new Collisin();}
else if(option.equals("驾驶员本身伤亡")){Insurance= new PersonInjur();}
else if(option.equals("财产损失")){Insurance= new Property();}
else if(option.equals("综合险")){Insurance= new Com();}
return Insurance;
}
}
抽象工厂模式
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String company=jComboBox3.getSelectedItem().toString();
String type=jComboBox4.getSelectedItem().toString();
AbstractInsurance selected=Match(company,type);
String showInfo=selected.getCompany()+"的"+selected.getType();
jTextArea1.append("抽象工厂模式:选择了"+showInfo+"\n");
}
public static AbstractInsurance Match(String company,String type)
{
CLI_Factory CLI_line = new CLI_Factory();
PAB_Factory PAB_line = new PAB_Factory();
AbstractInsurance choose = null;
if (company.equals("中国人寿保险"))
{
if(type.equals("人员伤亡"))
choose=CLI_line.ABodyInjured();
if(type.equals("碰撞"))
choose=CLI_line.ACollision();
if(type.equals("驾驶员本身伤亡"))
choose=CLI_line.APersonInjur();
if(type.equals("财产损失"))
choose=CLI_line.AProperty();
if(type.equals("综合险"))
choose=CLI_line.ACom();
}
else if(company.equals("平安保险"))
{
if(type.equals("人员伤亡"))
choose=PAB_line.ABodyInjured();
if(type.equals("碰撞"))
choose=PAB_line.ACollision();
if(type.equals("驾驶员本身伤亡"))
choose=PAB_line.APersonInjur();
if(type.equals("财产损失"))
choose=PAB_line.AProperty();
if(type.equals("综合险"))
choose=PAB_line.ACom();
}
return choose;
}
模式的优点
工厂方法模式:
支持开闭原则,具有良好的封装性和多态性,代码结构清晰,扩展性好,屏蔽产品类。
简单工程模式:
工厂类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,实现对责任的分割
抽象工厂模式:
一系列互相有关联的产品类,有相同的结构;一系列实的工厂类,实现有抽象工厂类提供的接口,每个工厂生产一组相关的产品类的对象。
模式的不足
工厂方法模式:
需要Creator和相应的子类作为载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次,例如本次实验。
简单工厂模式:
将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。采用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。
抽象工厂模式:
难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。