软件体系结构--工厂模式

解决问题类型

创建对象的代码时,需要设置许多条件语句,以便决定在什么条件下,何时、怎样创建某个类的对象,这样客户类变得比较臃肿,难以维护。


解决设计思路

讲创建对象的责任委托给某个特殊的类,工厂类


具体待解决的问题

设计一个汽车保险管理程序,通过知道所需的准确功能,从客户类的主方法中直接初始化类结构体中的某个子类。


UML设计

工厂模式

软件体系结构--工厂模式_第1张图片


简单工程模式

软件体系结构--工厂模式_第2张图片



核心代码

工厂方法模式

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和子类存在,则很好;否则的话,需要增加一个类层次,例如本次实验。

 

简单工厂模式:

将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。采用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。

 

抽象工厂模式:

难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。




你可能感兴趣的:(设计模式,Java)