博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)
阅读量:2039 次
发布时间:2019-04-28

本文共 3288 字,大约阅读时间需要 10 分钟。

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)增加了系统的抽象性和理解难度

转载地址:http://sryof.baihongyu.com/

你可能感兴趣的文章
ubuntu下安装nginx
查看>>
Linux 更改文件名
查看>>
Linux下安装Elasticsearch5.X
查看>>
linux命令ps aux|grep xxx详解
查看>>
在 Ubuntu 15.04 上如何安装Docker及基本用法
查看>>
ubuntu16.04安装最新版docker、docker-compose、docker-machine
查看>>
CentOs中mysql的安装与配置
查看>>
CentOS6.4下Mysql数据库的安装与配置
查看>>
Linux(Ubuntu)下MySQL的安装与配置
查看>>
windows环境下面配置pip环境变量
查看>>
python之pip常用命令
查看>>
完整过程解决 ERROR 1045 (28000): Access denied for user 'mysql'@'localhost' (using password: NO)
查看>>
Centos 与本地终端 上传、下载 文件
查看>>
linux下更改MySQL数据库存储路径
查看>>
WebService到底是什么?
查看>>
Git的安装和使用
查看>>
Git常用命令
查看>>
MySQL常见问题
查看>>
Spring Boot 入门之缓存和 NoSQL 篇(四)
查看>>
系统结构的发展以及为什么要使用分布式系统
查看>>