设计模式(三)---抽象工厂模式

1、 简介:为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类。抽象工厂模式通常是用于创创建一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。

2、 抽象工厂UML图

  

3、抽象工厂示意性类图

  

4、类图分析

  从上图可以看出,抽象工厂模式涉及到以下四个角色

  4、1:抽象工厂:担任这个角色的是工厂方法模式的核心,它与应用无关,任何在模式中创建对象的工厂都必须实现这个接口,在实际应用中,这个角色由java抽象类或接口来实现

  4、2:具体工厂:担任这个角色的是抽象工厂的具体实现类,具体工厂含有业务逻辑,并受到客户端的调用创建产品对象,这个角色由java类来实现。

  4、3:抽象产品:这个角色是工厂方法模式创建的对象的超类型(父类),在实际应用中,由java抽象类或是接口来实现

  4、4:具体产品:这个角色实现了抽象产品角色声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

5、源代码

   5.1:声明一个抽象产品接口 ProductA  作为A产品族的父类

package AbstractFactory;
/**
 *    ********************************************************
* @ClassName: Product
* @Description: 商品A接口
*
**********************************************************
 */
public interface ProductA {
    public void say();
}

  5.2:声明一个抽象产品接口 ProductB  作为B产品族的父类

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductB
* @Description: 商品B接口
*
**********************************************************
 */
public interface ProductB {
    public void say();
}

  5.3:创建具体产品ProductA1 实现接口ProductA

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductA1
* @Description: 具体产品类ProductA1
*
**********************************************************
 */
public class ProductA1 implements ProductA{
    public void say(){
        System.out.println("ProductA1");
    }
}

  5.4:创建具体产品ProductA2 实现接口ProductA

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductA1
* @Description: 具体产品类ProductA2
*
**********************************************************
 */
public class ProductA2 implements ProductA{
    public void say(){
        System.out.println("ProductA2");
    }
}

  5.5:创建具体产品ProductB1 实现接口ProductB

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductA1
* @Description: 具体产品类ProductB1
*
**********************************************************
 */
public class ProductB1 implements ProductB{
    public void say(){
        System.out.println("ProductB1");
    }
}

  5.6:创建具体产品ProductB2 实现接口ProductB

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductA1
* @Description: 具体产品类ProductB2
*
**********************************************************
 */
public class ProductB2 implements ProductB{
    public void say(){
        System.out.println("ProductB2");
    }
}

  5.7:创建实例化等级1产品的具体工厂类Product1Factory 实现IFactory工厂接口

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductAFactory
* @Description: 等级为1的产品族具体工厂类
*
**********************************************************
 */
public class Product1Factory  implements IFactory{
    public ProductA factoryA(){
        return new ProductA1();
    }

    public ProductB factoryB(){
        return new ProductB1();
    }
}

  5.8:创建实例化等级2产品的具体工厂类Product2Factory 实现IFactory工厂接口

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: ProductAFactory
* @Description: 等级为2的产品族具体工厂类
*
**********************************************************
 */
public class Product2Factory  implements IFactory{
    public ProductA factoryA(){
        return new ProductA2();
    }

    public ProductB factoryB(){
        return new ProductB2();
    }
}

  5.9:创建抽象工厂测试类

package AbstractFactory;
/**
 * ********************************************************
* @ClassName: AbstractFactoryTest
* @Description: 抽象工厂测试类
*
**********************************************************
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        //分别获取两个工厂对象
        IFactory factory1 = new Product1Factory();
        IFactory factory2 = new Product2Factory();

        ProductA  productA1 = factory1.factoryA();
        ProductB  productB1 = factory1.factoryB();

        ProductA  productA2 = factory2.factoryA();
        ProductB  productB2 = factory2.factoryB();

        productA1.say();
        productB1.say();
        productA2.say();
        productB2.say();
    }

}

  5.10:运行结果如下

时间: 2024-10-13 00:43:36

设计模式(三)---抽象工厂模式的相关文章

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

设计模式之抽象工厂模式(Abstract Factory)

1.定义 抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.类图 由于类太多就不上源码了~ 最佳实践: 在一个应用中,需要在三个不同平台(Windows.Linux.Android)上运行,通过抽象工厂模式屏蔽掉操作系统对应的影响三个不同操作系统上的软件功能.应用逻辑.UI都应该是非常类似的,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息. 设计模式之抽象工厂模式(Abstract Factory)

C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

原文:C#设计模式之三抽象工厂模式(AbstractFactory)[创建型] 一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

大话设计模式_抽象工厂模式(Java代码)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 简单描述:有多种抽象产品,并且每种抽象产品都有多个具体产品.一个抽象工厂,提供多个具体工厂,每个工厂则提供不同种类的具体产品. 大话设计模式中的截图: 例子代码: AbstractProductA类: 1 package com.longsheng.abstractfactory; 2 3 public abstract class AbstractProductA { 4 5 public abstract v

JAVA设计模式之抽象工厂模式

本文继续介绍23种设计模式系列之抽象工厂模式. 前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例. 例子背景: 随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件.于是这个工厂开始生产空调和发动机,用来组装汽车.这时候工厂有两个系列的产品:空调和发动机.宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机. 概念: 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.比如

C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂]的问题,我们引出了[工厂方法]模式,通过子类化工厂类,解决了工厂类责任的划分,

<十一>读<<大话设计模式>>之抽象工厂模式

学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难,就是设计程序遵循一些原则,让代码可复用,在修改的时候不用涉及太多的类,扩展方便,抽象工厂模式名字听起来抽象,但理解起来一点也不抽象,用语言可能不好理解,我喜欢通过代码理解,然后成为自己的东西. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. <<大话设计模式>>以项目上线时想换另外一个数据库为例子展开的,假如我没原来用的是SqlServer,现在换成access,代码如下: 1.访问数

【设计模式】 抽象工厂模式 Abstract Factory Pattern

简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式相对于简单工厂和工厂方法模式来着更具抽象性. 一.抽象工厂模式演绎 我们先来看一个简单的需求: 甲方要开发一套办公自动化软件,其中有一个非常重要的功能就是要能够导入Word 文档和Excel 文档. 开发人员拿到需求后就开始编码了,  很快代码写完了: public class ImportTool