目录
AbstractFactory 抽象工厂模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心产出的具体产品类是什么。这样一来,客户就从具体的产品中被解耦。
1.2. 自我理解
通过抽象工厂所提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各式各样的工厂,制造各样不同的产品。
核心思想是,如果需要一个工厂,这个工厂可以生产出相关联的一批产品,然后不同的工厂实现,会生产出一批不同的产品组合。
1.3. 抽象工厂的组成
AbstractFactory: 抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品。
ConcreteFactory: 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生产一组具体产品,这个产品构件成了一个产品种类,每一个产品都位于某个产品等级结构中。
AbstractProduct: 抽象产品角色,为每种产品声明接口。
ConcreteProduct: 具体产品角色,定义了工厂生产的具体产品对象,实现抽象产品接口声明的业务方法。
2. UML
3. Example
3.1. 场景
对于QQ老玩家老说,QQ秀是原来那个年代常用的。QQ秀有不同部位的style可以更换,也有主题可以选择。比如更换发型、上衣、裤子、鞋子、表情、翅膀、背景。等…
现在我们可以用抽象工厂来实现QQ秀主题功能,现在设计出来两款QQ秀主题,非主流、白领系列。两款主题包含了发型、服装。
3.2. AbstractFactory设计模式的代码实现
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
/** * Created * Date: 2021/06/11 13:46 <br/> * Description: 抽象工厂设计模式 * * @author jomin@loserzhao.com * @see */ public class AbstractFactoryPatthernDemo { public static void main(String[] args) { ThemeAFactory themeAFactoryInstance = ThemeAFactory.themeAFactoryInstance; themeAFactoryInstance.getClothingInstance().show(); themeAFactoryInstance.getHairstyleInstance().show(); ThemeBFactory themeBFactoryInstance = ThemeBFactory.themeBFactoryInstance; themeBFactoryInstance.getClothingInstance().show(); themeBFactoryInstance.getHairstyleInstance().show(); } /** * Author: jomin@loserzhao.com <br/> * Date: 17:12 2021-06-11 <br/> * Description: 抽象产品:发型 */ static abstract class Hairstyle { abstract void show(); } /** * Author: jomin@loserzhao.com <br/> * Date: 17:15 2021-06-11 <br/> * Description: 具体产品:发型-非主流 */ static class NonMainstreamHairstyle extends Hairstyle{ @Override void show() { System.out.println("发型-非主流-红色"); } } /** * Author: jomin@loserzhao.com <br/> * Date: 17:33 2021-06-11 <br/> * Description: 具体产品:发型-白领 */ static class WhiteCollarHairstyle extends Hairstyle{ @Override void show() { System.out.println("发型-白领-黑色37分"); } } /** * Author: jomin@loserzhao.com <br/> * Date: 17:12 2021-06-11 <br/> * Description: 抽象产品:服装 */ static abstract class Clothing { abstract void show(); } /** * Author: jomin@loserzhao.com <br/> * Date: 17:33 2021-06-11 <br/> * Description: 具体产品:服装-非主流-潮牌 */ static class NonMainstreamClothing extends Clothing{ @Override void show() { System.out.println("服装-非主流-潮牌"); } } /** * Author: jomin@loserzhao.com <br/> * Date: 17:33 2021-06-11 <br/> * Description: 具体产品:服装-白领-西装 */ static class WhiteCollarClothing extends Clothing{ @Override void show() { System.out.println("服装-白领-西装"); } } /** * Author: jomin@loserzhao.com <br/> * Date: 17:13 2021-06-11 <br/> * Description: 抽象工厂 */ static abstract class AbstractFactory { abstract Hairstyle getHairstyleInstance(); abstract Clothing getClothingInstance(); } /** * Author: jomin@loserzhao.com <br/> * Date: 17:13 2021-06-11 <br/> * Description: 具体工厂:QQ秀-主题A-非主流系列 */ static class ThemeAFactory extends AbstractFactory { private static final ThemeAFactory themeAFactoryInstance = new ThemeAFactory(); private ThemeAFactory(){} static{ System.out.println("QQ秀-主题A-非主流系列"); } @Override Hairstyle getHairstyleInstance() { return new NonMainstreamHairstyle(); } @Override Clothing getClothingInstance() { return new NonMainstreamClothing(); } } /** * Author: jomin@loserzhao.com <br/> * Date: 17:13 2021-06-11 <br/> * Description: 具体工厂:QQ秀-主题B-白领系列 */ static class ThemeBFactory extends AbstractFactory { private static final ThemeBFactory themeBFactoryInstance = new ThemeBFactory(); private ThemeBFactory(){} static{ System.out.println("QQ秀-主题A-白领系列"); } @Override Hairstyle getHairstyleInstance() { return new WhiteCollarHairstyle(); } @Override Clothing getClothingInstance() { return new WhiteCollarClothing(); } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/abstract-factory-designpattern-html.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。