软件设计模式与体系结构实验——2.1-1(2)(抽象)工厂模式的应用

一、实验三 工厂模式的应用

1.实验目的

  1. 掌握工厂模式(Factory)的特点
  2. 分析具体问题,使用工厂模式进行设计。

2.实验内容

【作业2.1-1】例2.3为使用工厂方法模式设计的汽车保险管理应用程序实例,现在需要扩张例2.3的设计图,添加一个名为LuxuryCarInsurance的类,并且需要编写此类和其他需要添加的类的代码,详细要求参见光盘的响应作业部分。

3.模式UML图

在这里插入图片描述
本题目设计程序的设计类图,及其他图:
在这里插入图片描述

4.模式代码

添加LuxuryCarInsurance类:

//创建LuxeryCarInsurance类,实现AutoInsurance接口
public class LuxuryCarInsurance implements AutoInsurance {
    
    
    private String description;

    public String getlnsuranceDescription() {
    
    
        description = "LuxuryCarlnsurance:' ninLuxuryCarlnsurance coverage pays for medical bills" +
                "lost wages, rehabilitation, treatment and/or" +
                "funeral costs for anyone injured or killed " + "by your car. Such coverage will also pay for" +
                "pain and suffering damages when a third " +
                "party successfully sues.";
        return description;
    }

    @Override
    public String getInfo() {
    
    
        description = "LuxuryCarlnsurance: \n\nLuxuryCarlnsurance coverage pays for medical bills" +
                "lost wages, rehabilitation, treatment and/or" +
                "funeral costs for anyone injured or killed " + "by your car. Such coverage will also pay for" +
                "pain and suffering damages when a third " +
                "party successfully sues.";
        return description;
    }
}


添加LuxuryCarPolicyProducer类:

public class LuxuryCarPolicyProducer implements PolicyProducer{
    
    
//    public AutoInsurance getPolicyObj(){
    
    
//        return new LuxuryCarlnsurance();
//    }//创建LuxeryPolicy 工厂类,实现 PolicyProducer接口

    @Override
    public AutoInsurance getInsurObj() {
    
    
        return (AutoInsurance) new LuxuryCarInsurance();
    }
}

添加Client类:

//(添加汽车保险名)
public static final String COMPREHENSIVE = "Comprehensive Coverage";
public static final String LUXURYCAR="LuxuryCar Insurance";

//(下拉框添加LuxeryCarInsurance保险选项)
cmbInsuranceType.addItem(COMPREHENSIVE);
cmbInsuranceType.addItem(LUXURYCAR);

//(添加触发事件判断)
else if(type.equals ( LUXURYCAR) ) {
    
    
    pp= new LuxuryCarPolicyProducer() ;
}

5.运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.实验小结

通过本次实验,学会了使用工厂方法模式。工厂方法模式的适用性如下:
在以下情况下,适用于工厂方法模式:
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

二、实验四 抽象工厂模式的应用

1.实验目的

  1. 掌握抽象工厂模式(Abstract Factory)的特点
  2. 分析具体问题,使用抽象工厂模式进行设计。

2.实验内容

【作业2.1-2】在例2.4中设计并且实现了豪华( Super)和中等(Medum)别墅(House)和公寓(Condo)的查询。要求在该设计的基础上,增加一个新的类SemiDetacher(半独立式楼宇),并且编写代码实现相应的查询功能。

3.模式UML图

在这里插入图片描述
本题目设计程序的设计类图,及其他图:
在这里插入图片描述

4.模式代码

添加SemiDetacher类:

public interface SemiDetacher {
    
    
    public String getSemiDetacherInfo();
    public String getSemiDetacherFeatures();
}

添加SuperSemiDetacher类:

public class SuperSemiDetacher implements SemiDetacher {
    
    
    private String name;

    public SuperSemiDetacher(String cName) {
    
    
        name = cName;
    }

    public String getSemiDetacherInfo() {
    
    
        return "superSemiDetacher.html";
    }

    public String getSemiDetacherFeatures() {
    
    
        return "Super SemiDetacher ";
    }
}

添加MediumSemiDetacher类:

public class MediumSemiDetacher implements SemiDetacher
{
    
    
    private String name;
    public MediumSemiDetacher(String cName)
    {
    
    
        name = cName;
    }


    @Override
    public String getSemiDetacherInfo() {
    
    
        return "MediumSemiDetacher.html";
    }

    public String getSemiDetacherFeatures()
    {
    
    
        return "Medium SemiDetacher ";
    }
}

添加 BuildingFactory:

public abstract SemiDetacher getSemiDetacher();

添加MediumBuildingFactory:

@Override
public SemiDetacher getSemiDetacher() {
    
    
   return new MediumSemiDetacher("Medium SemiDetacher");
}

添加SuperBuildingFactory:

@Override
public SemiDetacher getSemiDetacher() {
    
    
   return new SuperSemiDetacher("Super SemiDetacher");
}

添加GUI:

public static final String SEMIDETACHER= "SemiDetacher";
if(type.equals(AbstractFactoryGUI.SEMIDETACHER)){
    
    
    SemiDetacher cd = bf.getSemiDetacher();
    String fileNm =cd.getSemiDetacherInfo();
    putHouseInfoToScreen(fileNm);
}

5.运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.实验小结

工厂方法模式
(1)基本简介
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
(2)意图:
提供一个类,由它负责根据一定的条件创建某一具体类的实例。
(3)该模式中包含的角色及其职责

  1. 抽象工厂(Creator)角色 是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
  2. 具体工厂(Concrete Product)角色
    实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
  3. 抽象产品(Product)角色
    简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  4. 具体产品(Concrete Product)角色
    简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
    一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。

(4)实现要点

1. Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。
2. 工厂方法是可以带参数的。
3. 工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。
(5)总结
Factory Method模式是设计模式中应用最为广泛的模式,通过本文,相信读者已经对它有了一定的认识。然而我们要明确的是:在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。Factory Method要解决的就是对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则。
(6)问题

在简单工厂方法模式、工厂方法模式与抽象工厂模式中,哪个模式符合开闭原则?为什么?哪个模式一般不符合开闭原则?或者说明在哪种情况下,开闭原则成立,哪种情况下,开闭原则不成立。

答:简单工厂模式一般不符合开闭原则。在简单工厂模式中,如果要增加一个新产品类,相应地在工厂类中也要增加一个条件语句,用于创建新的产品类的对象。也就是说,必须修改工厂类的源代码。
工厂方法模式和抽象工厂模式符合开闭原则。因为在工厂方法模式和抽象工厂模式中,无需修改或者重新编译已经存在的代码,就可以添加新的产品类。
开闭模式是指对扩展开放,对修改关闭,说的更通俗点,就是说开发了一个软件,应该可以对它进行功能扩展(开放),而在进行这些扩展的时候,不需要对原来的程序进行修改(关闭)。

猜你喜欢

转载自blog.csdn.net/m0_52435951/article/details/124425684