我是靠谱客的博主 饱满小霸王,这篇文章主要介绍【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)1. 抽象工厂模式的介绍2. 抽象工厂模式的结构3. 抽象工厂模式的实现4. 抽象工厂模式的优缺点,现在分享给大家,希望可以做个参考。
1. 抽象工厂模式的介绍
工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题。
在抽象工厂模式的结构图有以下角色:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同的产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
2. 抽象工厂模式的结构
AbstractProductA和AbstractProductB是两个抽象产品 ,之所以为抽象,是因为它们都有可能有两种不同的实现。而ProductA1、ProductA2和ProductB1、ProductB2就是对两个抽象产品的具体分类的实现 。
通常是在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。
3. 抽象工厂模式的实现
定义抽象工厂生产武器和交通工具:
复制代码
1
2
3
4
5
6package com.siyi.abstractfactory; public abstract class AbstractFactory { public abstract Vehicle createVehicle(); public abstract Weapon createWeapon() ; }
定义抽象产品:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package com.siyi.abstractfactory; /** * 定义抽象交通工具 */ public abstract class Vehicle { public abstract void go(); } ---------------------------------- package com.siyi.abstractfactory; /** * 定义抽象武器 */ public abstract class Weapon { public abstract void shoot(); }
定义具体产品:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41package 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("坐小汽车远行"); } }
定义具体工厂:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35package 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(); } }
主方法:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package 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(); } }
运行结果如下:
复制代码
1
2
3
4
5坐小汽车远行 使用手枪射击 ------------------ 坐马车远行 使用箭射击
4. 抽象工厂模式的优缺点
1、优点
(1)具体产品在应用层代码隔离,无须关心创建细节
(2)将一系列的产品族统一到一起创建
2、缺点
(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
(2)增加了系统的抽象性和理解难度
最后
以上就是饱满小霸王最近收集整理的关于【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)1. 抽象工厂模式的介绍2. 抽象工厂模式的结构3. 抽象工厂模式的实现4. 抽象工厂模式的优缺点的全部内容,更多相关【设计模式】(四)抽象工厂模式(Abstract内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复