1.意图
提供一个创建一系列相关或相互依赖的对象的接口,而不需要制定具体类。在java中,大家都知道创建一个对象是使用new来定义的,如果我们在代码中使用new操作符,那么我们所编写的代码就成了硬编码,这样不仅日后不易扩展,而且维护修改麻烦更大。如果我们能够找到一个专门负责创建产品的类(Factory),让这个类(Factory)和客户打交道,这个时候,客户只要知道自己想要什么,这个类(Factory)就可以给你。可以简单的说就是把new操作符集中在(Factory)这个类中,他里边可能会是这样写的:
A getA() {return new A()}; B getB(){return new B()}等等。
2.动机
我们在什么情况下使用该方法,而且为什么要使用呢?
假如我们现在要生产汽车Car,这个Car有车门(Door) 车轮(Wheel), 引擎(engin)。
如果按照我们自己的方法去实现,可能是这样实现的:
createCar(){ d = new Door ;w = new Wheel(); e = new Engin()c = new Car(d,w,e);return c}.这里的客户端代码是创建车,也就是createCar方法。这个时候,我们应该觉着没什么问题,我们的车很好的创建了,但是我们也应该知道,这里边我们使用了硬编码,就是使用了具体类。如果说我们现在要改变一下车门的生产厂商,也就是一个新的door类,我们定义为NewDoor,或者NewEngin 或者NewWheel?那么这个时候我们该怎么办呢?我们能做的就是在客户端修改一下创建createCar方法(重载),这样如果我们不停的修改部件,就需要不停的去实现createCar方法,也就是客户端一直在变。如果我们提供一个接口,得到Car的组件,这样,当我们需要修改这些组件的供应商时,就不需要修改客户端,而是从新继承一个新的子类,在子类中修改重新相应组件的创建方法。而客户端却不需要做修改。当然这个时候客户端得知道要创建什么样的车,也就是使用什么样的工厂类。
这个时候的现实如下,因为现在是工厂给我创建对象,所以我们首先创建工厂类,
public interface AbstractFactory
{
public Door getDoor();public Wheel getWheel();public Engin getEngi();
}//注意我们提供创建对象的接口,而不提供具体实现,具体实现由子类去实现。
具体子类为:比如说现在要有BMW的Engin BC的Door BSJ的Wheel,则这个类实现如下:
public class FirstAbstractFactory{
public Door getDoor(){ return new BCDoor()}
public Wheel getWheel(){return new BSJWheel()}
public Engin getEngin(){return new BMWEngin()}
}
所以你想要什么样的车子,只要自己继承接口,然后用自己的类实现,就ok了
我们在看客户端代码,这个时候,客户端只要知道有工厂这么个东西,就可以了,所以客户端需要一个工厂的参数,形式可以如下:
createCar(AbstrackFactory af){ return Car(af.getDoor(),af.getWheel(),af.getEgin()) };
我可以看到,如果需要修改车内部组成情况,客户端只要修改一快地方,就ok了。
现在我们想想,这个过程到底给我们带来了什么好处呢?从我们编程的角度看,这样弄反而增加了我们编程的难度,让我多少转了一圈,然而他带来的好处是:容易扩展,修改小,客户端使用方便,其实这也正是设计模式的特点,就是说设计模式不是让一些框架一样,让你编程变的简单,相反他会使你的编程变难,而这样带来的好处是,软件易升级,维护和扩展。
3.优点及缺点
其他根据上面分析,我们很容易得知:
。容易交换产品系列,上面的例子我们只需要重写一个方法,就完成了,
。是整体配置一直,也就说什么什么样的工厂创建的车都完成一样。
。缺点,添加新产品对象时,难以扩展抽象工厂以便生产新种类的产品,因为AbstractFactory接口规定了所有可能被创建的产品集合,要支持新产品就要对该接口进行扩展,这涉及到对AbstractFactory及其所有子类进行修改,属于不便(违反了接口不便以及OCP开放封闭原则) 。所有实现了这个类的子类,都需要修改,因为父类添加了一个新方法。
4.适用性
1.当一个系统独立于他的产品的创建,组合和表示时
2.当一个系统需要一些产品中的一个配置时,
3.当你创建一个类库时,只给客户提供接口
其实我们可以看出,这个形式是一个工厂创建多个产品,相当于一个全能类,也叫上帝类,我叫这种模式为杂货店,因为他可以生产多种产品,而工厂方法模式,相当于专卖店,只能买一种产品,比如去李宁专卖店只能买到李宁的不能nike的,
以上内容是我个人在学习时总结,如果有不当之处,请多多赐教!
分享到:
相关推荐
本文将深入探讨Java中的工厂模式,包括基本的工厂模式、抽象工厂模式以及工厂方法模式。 **工厂模式**:工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。这样,客户端无需...
**JAVA设计模式之抽象工厂** 在软件工程中,设计模式是一种通用的解决方案,用来解决在特定上下文中反复出现的问题。抽象工厂(Abstract Factory)模式是其中一种创建型设计模式,它提供一个创建对象的接口,但允许...
工厂模式和抽象工厂模式是两种常用的创建型设计模式,它们在Java中有着广泛的应用。本文将详细探讨这两种模式的区别,并提供代码示例来加深理解。 工厂模式和抽象工厂模式都是创建型设计模式,它们提供了代码解耦和...
总的来说,抽象工厂模式在Java中是一种非常实用的设计模式,它可以帮助我们封装产品的创建过程,降低系统间的耦合度,同时提供了更好的可扩展性,使得添加新的产品族或者产品变得更加容易。在处理具有多种变体的复杂...
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
在"JAVA设计模式之抽象工厂模式"的示例中,可能会包含这些角色的实现以及如何在实际场景中应用抽象工厂模式的解释和示例代码。这个压缩包可能包含了详细的设计和实现,帮助学习者深入理解抽象工厂模式的工作原理及其...
java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...
**Java设计模式——抽象工厂** 在软件工程中,设计模式是一种在特定场景下解决常见问题的模板或蓝图。抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这...
java设计模式之抽象工厂模式实例,希望对大家有所帮助。
总结来说,Java设计模式之抽象工厂模式是一种用来创建一系列相关对象的设计模式,它通过提供抽象工厂接口来隔离具体产品的创建,使系统具备更好的扩展性和封装性。在实际开发中,我们可以根据需求选择使用抽象工厂...
实验的核心在于理解和实践**抽象工厂模式**,这是一种常用的面向对象设计模式,旨在解决软件设计中的灵活性和扩展性问题。实验的目标包括: 1. **深入理解抽象工厂模式的基本概念和原理**:通过理论学习和实际操作...
抽象工厂模式是设计模式中的一种,属于创建型模式,它为创建一组相关或相互依赖的对象提供了一个统一的接口,使得客户端无需关注这些对象的具体实现细节,仅需与抽象工厂交互即可。这种模式遵循开放封闭原则(OCP)...
java设计模式【之】抽象工厂模式【源码】【场景:制作咖啡】 * 抽象工厂 * * 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。 * 在工厂方法的基础上,进一步抽象工厂...
工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...
Java 中的抽象工厂模式提供了一个接口,用于创建一系列相关或依赖的对象,而无需指定它们的具体类。这增强了软件设计的模块化和灵活性。 实际示例: 想象一家家具公司,它使用 Java 中的抽象工厂模式来生产各种风格...
抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...
抽象工厂模式是软件设计模式中的一种,属于创建型模式,它提供了一种创建对象组族的接口,而无需指定其具体类。这种模式的关键在于抽象工厂,它定义了一组产品对象的接口,并且允许子类根据不同的实现来生产一系列...
### Java23种设计模式之抽象工厂模式 #### 模式动机 在探索设计模式的领域里,**抽象工厂模式**是一种重要的模式,它解决了一个关键问题:如何在一个系统中创建一系列相关或相互依赖的对象,而无需指定这些对象的...
### JAVA设计模式研究之抽象工厂模式 #### 一、引言 设计模式是软件工程领域的一项重大成就,它源自建筑学领域,旨在解决软件开发中常见的复杂问题,提供优雅而实用的解决方案。在面向对象编程中,设计模式尤为...
工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...