具体的实现代码见附件
问题引人:组装电脑,要选择机箱、电源、主板、CPU等,为了简单,只考虑主板和cpu。
主板和cpu都有型号,而且如果要组装cpu的针脚数和主板提供的cpu插口要匹配才行。客户负责选择cpu和主板,然后将这些配件给装机工程师,工程师只负责组装,如何用程序实现这一个过程,尤其是选择配件,不使用抽象工厂模式,对于装机工程师来说,只知道cpu和主板的接口,而不知其具体实现,可以选择使用简单工厂模式和工厂方法模式,为了简单,选择简单工厂模式。客户告诉装机工程师自己的选择,装机工程师就会到工厂中取得相应的对象实例。
实例有何问题呢??cpu对象和主板对象时有关系的,需要匹配的。----》抽象工厂模式
工厂方法或简单工厂关注的是单个产品对象的创建,而抽象工厂要创建一系列的产品对象,而且这些对象是有联系的。
抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
会定义一个抽象工厂,在里面虚拟地创建客户端所需的一系列对象,所谓虚拟就是定义创建这些对象的抽象方法,不去真正实现,
然后由具体的抽象工厂的子类来提供这一系列对象的创建。抽象工厂为子类提供一个统一的外观,供客户端调用。
抽象工厂模式结构:
AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口
ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现产品的创建
AbstractProduct:定义一类产品对象的接口
ConcreteProduct:具体的产品对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
Client:客户端,主要使用抽象工厂来获取一系列所需的产品对象,面向产品对象的接口编程,以实现需要的功能
如包abstractFactory中的实例定义
package abstractFactory;
/*
* 抽象工厂,声明创建对象的操作,抽象工厂通常实现为接口,不要被名称迷惑
*/
public interface AbstractFactory {
public AbstractProductA createProductA(); //创建抽象产品A
public AbstractProductB createProductB();
}
package abstractFactory;
//抽象产品A的接口
public interface AbstractProductA {
}
package abstractFactory;
//抽象产品B的接口
public interface AbstractProductB {
}
package abstractFactory;
//具体 的工厂实现对象,实现创建具体的产品对象的操作
public class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
package abstractFactory;
public class ConcreteFactory2 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
package abstractFactory;
//产品A的具体实现
public class ProductA1 implements AbstractProductA {
}
package abstractFactory;
//产品B的具体实现
public class ProductB1 implements AbstractProductB {
}
package abstractFactory;
public class Client {
public static void main(String[] args) {
// 创建抽象工厂对象
AbstractFactory af = new ConcreteFactory1();
// 通过抽象工厂,获取一系列的对象,如产品A和产品B
af.createProductA();
af.createProductB();
}
}
用抽象工厂模式解决问题,如chapter7中的abstractFactorySovle包
抽象工厂的功能是:为一系列相关的或有依赖关系的对象创建一个接口。这个接口里的方法不是任意定义的,而是相关的,有依赖的,如装配
cpu和主板,创建主板和创建cpu的方法的参数必须一致。
从某种意义上将,抽象工厂就是产品系列,如例子中代表的是电脑簇,每个不同的组装方案,代表不同的电脑系列。
抽象工厂通常实现为接口,不要被名称迷惑
如果要抽象工厂再创建一个内存对象,就必须在抽象工厂中增加一个方法,抽象工厂一变化,具体工厂就随着必须改变,如此就不够灵活
有一个相对灵活但不安全的方法,如extendedAbstractFactory包中的示例,添加新的产品对象,MemoryApi为其接口
抽象工厂模式和DAO
DAO:数据访问对象,是JavaEE的一个标准模式,通过它解决数据访问的一系列问题。也就是说,DAO需要抽象和封装所有对数据的访问,
实现DAO模式时候,最常见的实现策略就是使用工厂的策略,而且多采用抽象工厂模式来实现,factoryMethodDAO包中是利用
工厂方法模式实现的DAO策略,它要求DAO底层存储实现方式是固定的,对数据的操作是固定的,多用在一些简单的小项目上。
实际上更多时候DAO底层存储方式是不固定的,这是一般采用抽象工厂实现。如abstractFactoryDAO包中的示例
组装电脑示例使用抽象工厂实现dao,如包factoryMethodExampleDAO示例所示
抽象工厂模式的优点:
1,分离接口和实现,客户端使用抽象工厂来创建所需要的对象,而根本不知道具体的实现是谁。
2,使得切换产品簇变得容易,因为一个具体的工厂实现代表一个产品簇,比如schema1代表装机方案一,客户端选择不同的工厂实现,就相当于在切换不同的产品簇。
缺点:
1,不容易扩展到新产品,因为如果需要给整个产品簇添加产品,必须修改抽象工厂,这导致具体工厂实现也必须修改。
2,造成类层次复杂,
本质:选择产品簇的实现。
工厂方法是选择单个产品的实现,虽然一个类中可以有多个工厂方法,但他们之间都没有任何联系。但抽象工厂着重的是一个产品簇的选择实现,定义在
抽象工厂类的方法通常都是有联系的,如创建cpu和创建主板的方法。如果方法之间缺少联系就退化成了工厂方法,而工厂方法也可以退化成简单工厂。
分享到:
相关推荐
1. **模式结构**:抽象工厂模式通常包括抽象工厂接口(AbstractFactory),具体工厂类(ConcreteFactory),抽象产品接口(Product)以及具体产品类(ConcreteProduct)。抽象工厂定义了创建产品的方法,而具体工厂...
抽象工厂模式是设计模式中的一种创建型模式,其主要目的是为了解耦客户端代码与具体产品的实现。在软件工程中,当系统需要根据不同的平台、环境或者配置产生一系列相关对象,而这些对象之间的关系又非常复杂时,抽象...
抽象工厂模式可以帮助我们创建一个工厂接口,该接口声明了创建这些组件的方法,然后为每种操作系统实现一个具体的工厂类。 ```java // 抽象工厂接口 public interface GUIFactory { Button createButton(); ...
### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...
在软件工程中,抽象工厂模式经常用于框架和库的开发,它可以用来封装一系列相关或相互依赖的对象的创建,使得客户端代码可以在不关心具体实现的情况下使用这些对象。这样,当需要更换不同的产品族时,只需要替换对应...
此外,抽象工厂模式还可以与其他设计模式结合使用,比如工厂方法模式(Factory Method Pattern),在某些情况下,可以将抽象工厂模式的抽象工厂类设计为工厂方法模式,让子类决定实例化哪一个类。同时,抽象工厂模式...
设计模式抽象工厂模式(AbstractFactory)源代码
抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在Java编程中,这种模式通常用于隔离客户端与具体实现之间的耦合,使得系统可以在不修改代码...
抽象工厂模式是设计模式中的一种结构型模式,它在C++编程中有着广泛的应用。这个模式主要用于创建一系列相关的对象,而无需指定它们的具体类。在本文中,我们将深入探讨抽象工厂模式的概念、工作原理以及在C++中的...
抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的一种,它提供了一个接口用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的类。该模式的核心在于提供一个高层接口来创建一组相关的产品对象。...
这个压缩包“C# 抽象工厂 AbstractFactory.rar”可能包含了一个关于如何在C#中实现抽象工厂模式的实例或教程。 抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方式,而无需指定具体类。在C#中,这种...
在给定的压缩包文件中,"AbstractFactory"可能包含了一些示例代码或者实现,用来解释抽象工厂模式的具体应用。这些代码可能包括抽象工厂接口、具体工厂类以及抽象产品和具体产品的定义。通过查看这些代码,我们可以...
抽象工厂模式是设计模式中的一种结构型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。在Java中,这种模式常用于当系统需要根据不同的平台或环境创建不同类型的对象时,例如这里的“北方市场”和“南方...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种模式的关键在于抽象工厂,它定义了一组创建对象的接口,允许子类决定实例化哪一个类。...
**抽象工厂模式(Abstract Factory Pattern)**是一种创建型设计模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式是当一个系统需要根据不同的平台或者环境来创建一组相关或相互依赖的对象时,...
首先,我们来详细解释抽象工厂模式的基本概念。抽象工厂模式包含四个主要角色: 1. **抽象工厂(Abstract Factory)**:这是接口或者抽象类,定义了创建一系列相关或相互依赖对象的接口,而不涉及它们具体的类。 2. ...
抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在实际应用中,当我们需要创建一组具有共同特性的对象,而这些对象分别...
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)