实验1-工厂方法和抽象工厂模式
一、实验目的
1、学习StarUML软件,掌握类图绘制方法。
2、利用java实现工厂方法、抽象工厂模式。
二、实验内容
1.工厂方法模式设计与实现:Haier生产HaierAirCondition, Midea生产MideaAirCondition。
(1)类图
(2)代码
(3)实验结果
2、抽象工厂模式设计与实现:电脑配件生产工厂生产内存、CPU等硬件设备。
(1)类图
(2)代码
(3)实验结果
三、思考题
1.工厂方法模式与抽象工厂模式各自的特征是什么?区别是什么?
工厂方法模式特征:
(1)核心思想:工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象,将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
(2)模式结构:抽象产品(Product)、具体产品(ConcreteProduct)、抽象工厂(Factory)、具体工厂(ConcreteFactory)。
(3)优点:核心工厂类负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这允许系统在不修改工厂角色的情况下引进新产品;添加新的产品对象时,仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,符合“开闭原则”。
(4)缺点:考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
抽象工厂模式特征:
(1)核心思想:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
(2)模式结构:抽象产品(AbstractProduct)、具体产品(ConcreteProduct)、抽象工厂(AbstractFactory)、具体工厂(ConcreteFactory)。
(3)优点:隔离具体类的生成,因而更换一个具体工厂相对容易。所有的具体工厂都实现抽象工厂中定义的所有公共接口;客户端始终只使用同一个产品族中的对象,是非常实用的设计模式;增加新的具体工厂和产品族很方便,无须修改已有系统。
(4)缺点:添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品;开闭原侧的倾斜性(增加工厂和产品族容易,增加产品等级结构麻烦)。
区别:
工厂方法是“一个工厂只生产一种产品”,由子类决定具体产品类型。抽象工厂是“一个工厂可以生产多个产品”,生产一组相关的产品族。
2.工厂方法模式和抽象工厂模式各适用于什么类型的软件设计?
工厂方法模式适用场景:
(1)一个类不知道它所需要的对象的类:客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
(2)一个类通过其子类来指定创建哪个对象:对抽象工厂类只需提供创建产品的接口,由其子类确定要创建的对象,利用多态性和里氏代换原则,程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
(3)将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
抽象工厂模式适用场景:
(1)系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
(2)系统中有多于一个的产品族,而每次只使用其中某一产品族。
(3)同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现。
(4)系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。