[设计模式]抽象工厂模式

简介:

简介


抽象工厂模式 (Abstract Factory)提供一个 创建一系列相关或相互依赖对象的接口,而 无需指定它们具体的类
抽象工厂模式是一种 类创建型模式 ( 可参考  设计模式 创建型模式)。

结构


图-抽象工厂模式结构图

抽象工厂模式包含以下角色:

  • AbstractFactory(抽象工厂)
  • ConcreteFactory(具体工厂)
  • AbstractProduct(抽象产品)
  • ConcreteProduct(具体产品) 

AbstractProduct : 声明一个接口,这个接口中包含产品对象类型。

复制代码
abstract  class AbstractProductA {
     public  abstract  void show();
}

abstract  class AbstractProductB {
     public  abstract  void show();
}
复制代码

ConcreteProduct : 定义一个产品对象,这个产品对象是由相关的具体工厂创建的。

复制代码
class ConcreteProductA1  extends AbstractProductA {
    @Override
     public  void show() {
        System.out.println("ConcreteProductA1");
    }
}

class ConcreteProductA2  extends AbstractProductA {
    @Override
     public  void show() {
        System.out.println("ConcreteProductA2");
    }
}

class ConcreteProductB1  extends AbstractProductB {
    @Override
     public  void show() {
        System.out.println("ConcreteProductB1");
    }
}

class ConcreteProductB2  extends AbstractProductB {
    @Override
     public  void show() {
        System.out.println("ConcreteProductB2");
    }
}
复制代码

AbstractFactory : 声明一个接口,这个接口中包含创建抽象产品对象的方法。

abstract  class AbstractFactory {
     public  abstract AbstractProductA createProductA();
     public  abstract AbstractProductB createProductB();
}

ConcreteFactory : 实现创建具体产品对象的方法。

复制代码
class ConcreteFactory1  extends AbstractFactory {
    @Override
     public AbstractProductA createProductA() {
         return  new ConcreteProductA1();
    }

    @Override
     public AbstractProductB createProductB() {
         return  new ConcreteProductB1();
    }
}

class ConcreteFactory2  extends AbstractFactory {
    @Override
     public AbstractProductA createProductA() {
         return  new ConcreteProductA2();
    }

    @Override
     public AbstractProductB createProductB() {
         return  new ConcreteProductB2();
    }
}
复制代码

Client : 只使用 AbstractFactory 和 AbstractProduct 声明的接口。

复制代码
public  class AbstarctFactoryPattern {
     public  static  void main(String[] args) {
        AbstractFactory  factory1  =  new ConcreteFactory1();
        AbstractProductA productA1 = factory1.createProductA();
        AbstractProductB productB1 = factory1.createProductB();
        productA1.show();
        productB1.show();
        
        AbstractFactory  factory2  =  new ConcreteFactory2();
        AbstractProductA productA2 = factory2.createProductA();
        AbstractProductB productB2 = factory2.createProductB();
        productA2.show();
        productB2.show();
    }
}
复制代码

运行结果

ConcreteProductA1
ConcreteProductB1
ConcreteProductA2
ConcreteProductB2
 

动机


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

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

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

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


要点


优点

(1)抽象工厂模式隔离了具体类的生成,用户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。

(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。 

(3)增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开放封闭原则”

缺点

在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。


实例


众所周知,苹果和三星这两家世界级的电子产品厂商都生产手机和电脑。

我们以生产手机和电脑为例,演示一下抽象工厂模式的应用

AbstractProduct 角色

首先,定义手机和电脑两个抽象接口,他们都有各自的产品信息 

复制代码
interface Telephone {
     public String getProductInfo();
}

interface Computer {
     public String getProductInfo();
}
复制代码

ConcreteProduct 角色

ConcreteProduct 根据  AbstractProduct 来定义具体的产品属性、方法。

在我们的例子中,苹果、三星两家公司的手机和电脑都有各自的具体产品信息。 

复制代码
class AppleTelephone  implements Telephone {

    @Override
     public String getProductInfo() {
         return "苹果手机,采用ios系统";
    }
}

class SamsungTelephone  implements Telephone {

    @Override
     public String getProductInfo() {
         return "三星手机,采用android系统";
    }
}

class AppleComputer  implements Computer {

    @Override
     public String getProductInfo() {
         return "苹果电脑,采用mac系统";
    }
}

class SamsungComputer  implements Computer {

    @Override
     public String getProductInfo() {
         return "三星电脑,采用windows系统";
    }
}
复制代码

AbstractFactory 角色

苹果,三星这两个厂商都生产手机和电脑。所以它们可以有一个抽象父类或父接口,提供生产手机和生产电脑的方法。

复制代码
interface ElectronicFactory {
    
     public Telephone produceTelephone();

     public Computer produceComputer();
}
复制代码

ConcreteFactory 角色

苹果、三星工厂分别实现父接口,生产不同类型的产品。 

复制代码
class AppleFactory  implements ElectronicFactory {

    @Override
     public Telephone produceTelephone() {
         return  new AppleTelephone();
    }

    @Override
     public Computer produceComputer() {
         return  new AppleComputer();
    }
}

class SamsungFactory  implements ElectronicFactory {

    @Override
     public Telephone produceTelephone() {
         return  new SamsungTelephone();
    }

    @Override
     public Computer produceComputer() {
         return  new SamsungComputer();
    }
}
复制代码

测试代码

复制代码
public  class PhoneFactoryDemo {
     public  static  void main(String[] args) {
        ElectronicFactory appleFactory =  new AppleFactory();
        Telephone phone = appleFactory.produceTelephone();
        System.out.println(phone.getProductInfo());
        Computer computer = appleFactory.produceComputer();
        System.out.println(computer.getProductInfo());
    }
}
复制代码

运行结果 

苹果手机,采用ios系统
苹果电脑,采用mac系统

 本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/p/4211446.html,如需转载请自行联系原作者

相关文章
|
5月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
29 0
|
4月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
29 5
|
8天前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
5月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
5月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
55 2
|
5月前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
172 4
|
2月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
32 1
|
2月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
2月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
2月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式