设计模式(五)抽象工厂(创建型)

简介:

抽象工厂(abstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类。

适用场合:

1.一个系统要独立于它的产品的创建、组合和表示时。

2.一个系统要由多个产品系列中的一个来配置时。

3.当你强调一系列相关的产品对象的设计以便进行联合使用时。

4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。

类图                          

1

代码                                                            

抽象工厂abstractFactory的代码:

public interface AbstractFactory {
    public ProductA factoryA();
    public ProductB factoryB();
}

具体工厂类实现AbstractFactory,用于创建对象。

复制代码
public class ConcreteFactory1 implements AbstractFactory {

    @Override
    public ProductA factoryA() {
        return new ProductA1();
    }

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

}
复制代码
复制代码
public class ConcreteFactory2 implements AbstractFactory {

    @Override
    public ProductA factoryA() {
        return new ProductA2();
    }

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

}
复制代码

产品A的抽象接口(同理产品B):

public interface ProductA {
    public void method1();
    public void method2();
}

产品A的具体实现(同理产品B):

复制代码
public class ProductA1 implements ProductA {

    @Override
    public void method1() {
        System.out.println("ProductA1---->method1");

    }

    @Override
    public void method2() {
        System.out.println("ProductA1---->method2");

    }

}
复制代码
复制代码
public class ProductA2 implements ProductA {

    @Override
    public void method1() {
        System.out.println("ProductA2---->method1");

    }

    @Override
    public void method2() {
        System.out.println("ProductA2---->method2");

    }

}
复制代码

抽象工厂模式的应用代码:

复制代码
public class Main {

    public static void main(String[] args) {
        AbstractFactory abf1 = new ConcreteFactory1();
        AbstractFactory abf2 = new ConcreteFactory2();

        ProductA a1 = abf1.factoryA();
        ProductA a2 = abf2.factoryA();
        ProductB b1 = abf1.factoryB();
        ProductB b2 = abf2.factoryB();
        
        a1.method1();
        a1.method2();
        a2.method1();
        a2.method2();
        b1.method1();
        b1.method2();
        b2.method1();
        b2.method2();

    }

}
复制代码

工厂方法与抽象工厂的区别                   

  • 工厂方法模式

一个抽象产品类,可以派生出多个具体产品类。  

一个抽象工厂类,可以派生出多个具体工厂类。  

每个具体工厂类只能创建一个具体产品类的实例。

  • 抽象工厂模式

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。  

一个抽象工厂类,可以派生出多个具体工厂类。  

每个具体工厂类可以创建多个具体产品类的实例。   
   

  • 区别

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。  

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

抽象工厂的应用            

  • 抽象工厂模式的使用场景

抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式,什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是*nix下的文本编辑器和WINDOWS下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况,也就是具有了共同的约束条件:操作系统类型,于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

  • 抽象工厂模式的注意实现

在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚是产品族扩展困难,而不是产品等级,在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可,也就是说横向扩展容易,纵向扩展困难。

  • 最佳实践

一个模式在什么情况下才能够使用,是很多读者比较困惑的地方,抽象工厂模式是一个简单的模式,使用的场景非常多,大家在软件产品开发过程中,涉及到不同操作系统的时候,都可以考虑使用抽象工厂模式,例如一个应用,需要在三个不同平台上运行:Windows、Linux、Android上运行,你会怎么设计?分别设计三套不同的应用?非也非也,通过抽象工厂模式屏蔽掉操作系统对应用的影响。三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息。




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3856199.html,如需转载请自行联系原作者

相关文章
|
6月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
6月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
60 2
|
设计模式 Java 关系型数据库
解锁设计模式的神秘面纱:编写无懈可击的代码之抽象工厂设计模式
解锁设计模式的神秘面纱:编写无懈可击的代码之抽象工厂设计模式
45 0
|
6月前
|
设计模式
设计模式-抽象工厂
设计模式-抽象工厂
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 架构师
设计模式之抽象工厂
设计模式之抽象工厂
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
43 3
|
5月前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
5月前
|
设计模式 Java
设计模式-抽象工厂(JAVA)
设计模式-抽象工厂(JAVA)
|
6月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
67 1

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78