应用场景

某手机操作系统可以根据用户不同的喜好在多种主题之间进行切换,随着主题的变化,系统中的字体、app图标、壁纸、锁屏壁纸等元素会随之发生变化。

使用抽象工厂模式设计手机主题库

创建元素接口

//图标
public interface Oyy22Icon {public void changeIcon();
}
//字体
public interface Oyy22Typeface {public void changeTypeface();
}
//壁纸
public interface Oyy22Wallpaper {public void changeWallpaper();
}
//锁屏壁纸
public interface Oyy22LsWallpaper {public void changeLsWallpaper();
}

创建主题A

public  class Oyy22IconA implements Oyy22Icon{@Overridepublic  void changeIcon(){System.out.println("图标1已应用!");}
}public class Oyy22TypefaceA implements Oyy22Typeface{@Overridepublic void changeTypeface() {System.out.println("字体1已应用!");}
}public  class Oyy22WallpaperA implements Oyy22Wallpaper{@Overridepublic void changeWallpaper() {System.out.println("壁纸1已应用!");}
}public class Oyy22LsWallpaperA implements Oyy22LsWallpaper {@Overridepublic void changeLsWallpaper() {System.out.println("锁屏壁纸1已应用!");}
}

创建主题B

public class Oyy22IconB implements Oyy22Icon {@Overridepublic  void changeIcon(){System.out.println("图标2已应用!");}
}public class Oyy22TypefaceB implements Oyy22Typeface{@Overridepublic void changeTypeface() {System.out.println("字体2已应用!");}
}public  class Oyy22WallpaperB implements Oyy22Wallpaper{@Overridepublic void changeWallpaper() {System.out.println("壁纸2已应用!");}
}public class Oyy22LsWallpaperB implements Oyy22LsWallpaper {@Overridepublic void changeLsWallpaper() {System.out.println("锁屏壁纸2已应用!");}
}

建立抽象工厂

public interface Oyy22TitleFactory {public Oyy22Typeface productTypeface();public Oyy22Wallpaper productWallpaper();public Oyy22LsWallpaper productLsWallpaper();public Oyy22Icon productIcon();
}

主题A样式

public class Oyy22TitleAFactory implements Oyy22TitleFactory{@Overridepublic Oyy22Typeface productTypeface(){return new Oyy22TypefaceA();}@Overridepublic Oyy22LsWallpaper productLsWallpaper(){return new Oyy22LsWallpaperA();}@Overridepublic Oyy22Wallpaper productWallpaper(){return new Oyy22WallpaperA();}@Overridepublic Oyy22Icon productIcon(){return new Oyy22IconA();}
}

主题B样式

public class Oyy22TitleBFactory implements Oyy22TitleFactory{@Overridepublic Oyy22Typeface productTypeface(){return new Oyy22TypefaceB();}@Overridepublic Oyy22LsWallpaper productLsWallpaper(){return new Oyy22LsWallpaperB();}@Overridepublic Oyy22Wallpaper productWallpaper(){return new Oyy22WallpaperB();}@Overridepublic Oyy22Icon productIcon(){return new Oyy22IconB();}
}

测试代码

public class Test {public static void main(String[] args) {try{Oyy22TitleFactory factory;Oyy22Typeface typeface;Oyy22Wallpaper wallpaper;Oyy22LsWallpaper lSWallpaper;Oyy22Icon icon ;factory=(Oyy22TitleFactory)ReadXML.getObject();typeface=factory.productTypeface();typeface.changeTypeface();wallpaper=factory.productWallpaper();wallpaper.changeWallpaper();lSWallpaper=factory.productLsWallpaper();lSWallpaper.changeLsWallpaper();icon=factory.productIcon();icon.changeIcon();}catch(Exception e) {System.out.println("error");System.out.println(e.getMessage());}}
}

配置类

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
class ReadXML {public static Object getObject() {try {DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File("AbstractFactory/src/config.xml"));NodeList nl = doc.getElementsByTagName("className");Node classNode = nl.item(0).getFirstChild();String cName =classNode.getNodeValue();Class<?> c = Class.forName(cName);Object obj = c.newInstance();return obj;} catch (Exception e) {e.printStackTrace();return null;}}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<config><className>Oyy22TitleBFactory</className>
</config>

绘制抽象工厂类图

拓展:为系统增加一种新的主题,绘制类图并实现,此时系统类图有何变化?

public class Oyy22TitleCFactory implements Oyy22TitleFactory{@Overridepublic Oyy22Typeface productTypeface(){System.out.println("字体3已应用!");return new Oyy22TypefaceB();}@Overridepublic Oyy22LsWallpaper productLsWallpaper(){System.out.println("锁屏壁纸2已应用!");return new Oyy22LsWallpaperB();}@Overridepublic Oyy22Wallpaper productWallpaper(){System.out.println("壁纸2已应用!");return new Oyy22WallpaperB();}@Overridepublic Oyy22Icon productIcon(){System.out.println("图标2已应用!");return new Oyy22IconB();}
}

此时只需要添加主题C即可,应用只需在配置文件上修改主题类名即可;此时的系统类图如下:

追问:如果当系统主题发生变化的时候通讯录风格也发生变化,在这种情况之下上面设计的系统将如何变化?

在主题里建立一个通讯录的产品,然后加入一个新的工厂类-通讯录类即可,原有代码需要有较大的修改

上面两题结论说明了什么

在抽象工厂模式里,如果只是增加一个新的产品,比如改题目增加一个主题,只需要增加相应的具体工厂就行,再将配置文件里的具体工程类类名改成新增的工厂类类名,原有代码无需修改,但是要增加一种新的产品,即通讯录也随主题变化而变化,那么原有类名需要较大的修改,在抽象工厂里需要声明一个通讯录的方法,所有的具体工厂类都需要实现该方法,将导致系统不再符合“开放原则”。

抽象工厂模式--实例分析相关推荐

  1. 设计模式之抽象工厂模式实例(c++)

    抽象工厂模式实例之电器工厂: 电器工厂类图: 此节也用到了C++反射注册机制,可以参考上篇内容,是一样的. 抽象工厂和工厂方法.简单工厂是有关系的.当抽象工厂中的每一个具体工厂类只生产一个产品对象的时 ...

  2. 设计模式-抽象工厂模式实例(二)

    (1)案例背景: 计算机包含内存(RAM),CPU等硬件设备 (2)实现步骤: 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类AbstractFactory, PcFactory和M ...

  3. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  4. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  5. 设计模式 — 抽象工厂模式

    抽象工厂模式 女娲的失误 实例 一 实例 二 抽象工厂模式的应用 抽象工厂模式的优点 抽象工厂模式的缺点 抽象工厂模式的使用场景 抽象工厂模式的注意事项 女娲的失误 女娲造人的故事.人是造出来了,世界 ...

  6. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  7. C++设计模式详解之抽象工厂模式解析

    抽象工厂模式概念 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类 抽象工厂模式实例 以组装电脑为例,一般来说,电脑组装都不可能是一家公司的零件,简单的来说,显卡就有NVIDIA和A ...

  8. java不同工厂生产不同电器_完整案例分析再加知识整合——艾特抽象工厂模式,超详细的...

    抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产 ...

  9. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

    在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...

最新文章

  1. 06-1. 简单计算器(20)
  2. 当前目录下所有代码中查找
  3. matlab 两个向量的交集,matlab – 两个向量之间的相关性?
  4. Leetcode 167. 两数之和 II - 输入有序数组 (每日一题 20210818)
  5. 【网络安全】简要分析下Chrome-V8-Issue-762874
  6. eclipse查看git地址_Git大文件管理:函数计算和OSS支持的Git LFS服务器
  7. LeetCode每日一题: 缺失数字(No.268)
  8. CentOS6.5 常用命令
  9. 键盘按键用硅胶材料更好
  10. 云钉一体,支撑5亿用户1900万企业背后的技术复盘
  11. win10 多任务 多视图 多窗口 处理快捷键
  12. 企业网站建设流程是什么?三个流程要知道
  13. win7桌面我的计算机打不开怎么回事,win7系统双击我的电脑打不开的解决方法
  14. rabbitmq高并发RPC调用,你Get到了吗?
  15. php抢票程序,python并发编程多进程 模拟抢票实现过程
  16. eclipse上配置JavaFX完整教程
  17. Dubbo相关问题如何用管程实现异步转同步?
  18. 运筹说 第92期|爱思唯尔“高被引学者“
  19. 安装软件提示无效驱动器D
  20. Linux(centos 7) 安装mysql(5.7)

热门文章

  1. 2019 我的小目标
  2. 处理IE9下onpropertychange无法触发最简洁的方法
  3. matlab对一组数据傅里叶变换,matlab快速傅里叶变换(三个matlab程序介绍)
  4. 音频(一) - 音频基础知识
  5. mall在Linux环境下的部署(基于Docker容器)
  6. JS实现身份证的验证
  7. Ubuntu 18.04安装Adams 2021
  8. python rgb转yuv_YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!)...
  9. C语言之循环while,do-while,for的简单使用方法及区别
  10. 修改 CentOS8内置的yum镜像地址