![](https://csdnimg.cn/release/download_crawler_static/87137784/bg6.jpg)
重复发明
5、 比较抽象工厂模式和工厂方法模式相似性和差异性。什么情况下使用抽象工厂模式?什
么情形下使用工厂方法模式?
答:简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型
模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易发生变
化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩
展。用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面为比较:
简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的
父类。它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应
该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目
标,所有创建的对象都是充当这个角色的某个具体类的实例。在这个模式中,工厂类是整个
模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪
个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对
象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
工厂方法模式:工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。提
前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加
接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去
实现。工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实
现‘开-闭 原则’,实现了可扩展。其次实现更复杂的层次结构,可以应用于产品结果复
杂的场合。工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的 Factory 类(可以是
抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工
作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对
应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
抽象工厂模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端
提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以
派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是
针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对
的是多个产品等级结果。
相似性:都是保留不变的部分提取出来,将可变的部分抽象成接口,以达到最大程度的复用,
实现面向对象的开放关闭原则。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
抽象工厂适用情况:1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,
这对于所有形态的工厂模式都是重要的。
2、 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
3、 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4、 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
工厂方法适用情况:1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是
代理者这一信息局部化的时候。
6、 简述原型模式中浅层克隆和深度克隆的区别?分别给出代码说明。