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

1. 抽象工厂模式的介绍

工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题。

在抽象工厂模式的结构图有以下角色:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建
  3. 抽象产品(Product)定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品
  4. 具体产品(ConcreteProduct)实现抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

2. 抽象工厂模式的结构

AbstractProductA和AbstractProductB是两个抽象产品 ,之所以为抽象,是因为它们都有可能有两种不同的实现。而ProductA1、ProductA2和ProductB1、ProductB2就是对两个抽象产品的具体分类的实现 。

通常是在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂

3. 抽象工厂模式的实现

定义抽象工厂生产武器和交通工具:

package com.siyi.abstractfactory;public abstract class AbstractFactory {   public abstract Vehicle createVehicle();   public abstract Weapon createWeapon() ;}

定义抽象产品:

package com.siyi.abstractfactory;/** * 定义抽象交通工具 */public abstract class Vehicle {    public abstract void go();}----------------------------------package com.siyi.abstractfactory;/** * 定义抽象武器 */public abstract class Weapon {    public abstract void shoot();}

定义具体产品:

package com.siyi.abstractfactory;public class Arrow extends Weapon {    @Override    public void shoot() {        System.out.println("使用箭射击");    }}-------------------------------------------------package com.siyi.abstractfactory;public class Pistol extends Weapon{    @Override    public void shoot() {        System.out.println("使用手枪射击");    }}-------------------------------------------------package com.siyi.abstractfactory;public class Carriage extends Vehicle {    @Override    public void go() {        System.out.println("坐马车远行");    }}-------------------------------------------------package com.siyi.abstractfactory;public class Car extends Vehicle {    @Override    public void go() {        System.out.println("坐小汽车远行");    }}

定义具体工厂:

package com.siyi.abstractfactory;/** * 古代工厂 */public class AncientFactory extends AbstractFactory {    @Override    public Vehicle createVehicle() {        return new Carriage();    }    @Override    public Weapon createWeapon() {        return new Arrow();    }}-----------------------------------------------------package com.siyi.abstractfactory;/** * 现代工厂 */public class ModernFactory extends AbstractFactory {    @Override    public Vehicle createVehicle() {        return new Car();    }    @Override    public Weapon createWeapon() {        return new Pistol();    }}

主方法:

package com.siyi.abstractfactory;public class Main {    public static void main(String[] args) {        //创建具体工厂对象        AbstractFactory modernFactory = new ModernFactory();        AbstractFactory ancientFactory = new AncientFactory();        //通过具体工厂创建具体产品        Vehicle modernVehicle = modernFactory.createVehicle();        Weapon modernWeapon = modernFactory.createWeapon();        modernVehicle.go();        modernWeapon.shoot();        System.out.println("------------------");        Vehicle ancientVehicle = ancientFactory.createVehicle();        Weapon ancientWeapon = ancientFactory.createWeapon();        ancientVehicle.go();        ancientWeapon.shoot();    }}

运行结果如下:

坐小汽车远行使用手枪射击------------------坐马车远行使用箭射击

4. 抽象工厂模式的优缺点

1、优点

(1)具体产品在应用层代码隔离,无须关心创建细节
(2)将一系列的产品族统一到一起创建

2、缺点

(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
(2)增加了系统的抽象性和理解难度

来源:https://www.icode9.com/content-4-840101.html

(0)

相关推荐

  • 【C++设计模式二】C++工厂模式

    (1)定义 简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑.为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂, ...

  • 一篇带你读懂工厂模式

    工厂模式 简单工厂模式 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行 主要解决:主要解决接口选择的问题. 何时使用:我们明确地计划不同条件下创建 ...

  • 【设计模式】工厂方法模式

    定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类 优缺点 优点 针对简单工厂不容易扩展,工厂方法将实例化延迟到子类工厂,从而提供扩展 缺点 每次新增产品 ...

  • 重温设计模式之 Factory

    前言 创建型模式的核心干将,工厂.简单工厂.抽象工厂,还记得清么,一文回顾和对比下. 一  为什么需要工厂 系统中总是需要创建对象的,一般使用new()来创建对象.创建对象可以是简单的new(),也可 ...

  • 设计模式之工厂模式(factory pattern)

    工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创建型模式.本文从一 ...

  • 设计模式----------工厂(Factory)模式

    作用 实现了创建者和调用者分离. 工厂模式核心/本质: 实例化对象不在使用new,而是用工厂方法代替. 将选择实现类,创建对象统一管理和控制,从而实现调用者和我们实现类解耦 工厂模式详细分类 1.简单 ...

  • 工厂模式讲解, 引入Spring IOC

    目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...

  • 抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...

  • PHP设计模式之抽象工厂模式

    PHP设计模式之抽象工厂模式 工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式.初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着"抽象" ...

  • [PHP小课堂]PHP设计模式之抽象工厂模式

    [PHP小课堂]PHP设计模式之抽象工厂模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 工厂模式(Factory Pattern)

    Factory Pattern 创造型设计模式,提供一个创造对象的方式,在工厂模式中,创造对象的逻辑不对外暴露创建,只提供一个创建的接口. 定义一个创建对象的接口,其子类决定去创建哪一个实例对象,创建 ...

  • 大白话简单工厂模式 (Simple Factory Pattern)

    从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车.4S店接受订单后,向工厂说明车型,工厂随后进行汽车制造,运输到4S店 ...

  • 简单工厂模式(Simple Factory Pattern)

    定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法( ...

  • 【8/25】使用抽象工厂模式(Abstract Factory Pattern) 封装页面对象的创建过程

    这是<小游戏从0到1设计模式重构>系列内容第8篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完了三姐妹中的大姐.二姐,最 ...

  • 设计模式——把类作为参数的抽象工厂模式

    今天给大家介绍一个非常简单的设计模式,一学就会,非常好用. 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑.主要的用途一般是将一些复杂的类的创建过程整合在一起 ...