抽象工厂模式之手机主题

1、 实例概况

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

(1)请使用抽象工厂模式设计系统

(2)为系统增加一种新的主题,并实现

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

(4)(2)和(3)的结论说明了什么?

2、实例类图

3、实例实现代码

3.1抽象产品类ZC32Typeface(字体类)

public interface ZC32Typeface {public void changeTypeface();
}

3.11具体产品类ZC32Typeface1(字体1类)

public class ZC32Typeface1 implements ZC32Typeface{public void changeTypeface() {System.out.println("字体1已应用!");}
}

3.12具体产品类ZC32Typeface2(字体2类)

public class ZC32Typeface2 implements ZC32Typeface{public void changeTypeface() {System.out.println("字体2已应用!");}
}

3.2抽象产品类ZC32Wallpaper(壁纸类)

public interface ZC32Wallpaper {public void changeWallpaper();
}

3.21具体产品类ZC32Wallpaper1(壁纸1类)

public class ZC32Wallpaper1 implements ZC32Wallpaper{public void changeWallpaper() {System.out.println("壁纸1已应用!");}
}

3.22具体产品类ZC32Wallpaper2(壁纸2类)

public class ZC32Wallpaper2 implements ZC32Wallpaper{public void changeWallpaper() {System.out.println("壁纸2已应用!");}
}

3.3抽象产品类ZC32LSWallpaper(锁屏壁纸类)

public interface ZC32LSWallpaper {public void changeLSWallpaper();
}

3.31具体产品类ZC32LSWallpaper1(锁屏壁纸1类)

public class ZC32Wallpaper1  implements ZC32LSWallpaper{public void changeLSWallpaper() {System.out.println("锁屏壁纸1已应用!");}
}

3.32具体产品类ZC32LSWallpaper2(锁屏壁纸2类)

public class ZC32Wallpaper2 {public void changeLSWallpaper()  implements ZC32LSWallpaper{System.out.println("锁屏壁纸2已应用!");}
}

3.4抽象产品类ZC32Lcon(图标类)

public interface ZC32Lcon {public void changeLcon();
}

3.41抽具体产品类ZC32Lcon1(图标1类)

public class ZC32Lcon1 {public void changeLcon() implements ZC32Lcon{System.out.println("图标1已应用!");}
}

3.42抽具体产品类ZC32Lcon2(图标2类)

public class ZC32Lcon2 {public void changeLcon() implements ZC32Lcon{System.out.println("图标2已应用!");}
}

3.5抽象工厂类ZC32TitleFactory(主题工厂类)

public interface ZC32TitleFactory {public ZC32Typeface produceTypeface();public ZC32Wallpaper produceWallpaper();public ZC32LSWallpaper produceLSWallpaper();public ZC32Lcon produceLcon();
}

3.51具体工厂类ZC32TitleFactory1(主题工厂1类)

public class ZC32TitleFactory1 implements ZC32TitleFactory{public ZC32Typeface produceTypeface() {return new  ZC32Typeface1();}public ZC32Wallpaper produceWallpaper() {return  new ZC32Wallpaper1();}public ZC32LSWallpaper produceLSWallpaper() {return  new ZC32LSWallpaper1();}public ZC32Lcon produceLcon() {return new ZC32Lcon1();}
}

3.52具体工厂类ZC32TitleFactory2(主题工厂2类)

public class ZC32TitleFactory2 implements ZC32TitleFactory{public ZC32Typeface produceTypeface() {return new  ZC32Typeface2();}public ZC32Wallpaper produceWallpaper() {return  new ZC32Wallpaper2();}public ZC32LSWallpaper produceLSWallpaper() {return  new ZC32LSWallpaper2();}public ZC32Lcon produceLcon() {return new ZC32Lcon2();}
}

3.6客户端测试类ZC32Client

public class ZC32Client {public static void main(String args[]) {try{ZC32TitleFactory factory;ZC32Typeface typeface;ZC32Wallpaper wallpaper;ZC32LSWallpaper lSWallpaper;ZC32Lcon lcon ;factory=(ZC32TitleFactory)XMLUtil.getBean();typeface=factory.produceTypeface();typeface.changeTypeface();wallpaper=factory.produceWallpaper();wallpaper.changeWallpaper();lSWallpaper=factory.produceLSWallpaper();lSWallpaper.changeLSWallpaper();lcon=factory.produceLcon();lcon.changeLcon();}catch(Exception e) {System.out.print("sssss");System.out.print(e.getMessage());}}
}

4、辅助代码

4.1XML操作工具类XMLUtil

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;public class XMLUtil {public static Object getBean() {try {//创建DOM文档对象DocumentBuilderFactory dFactory =DocumentBuilderFactory.newInstance();DocumentBuilder builder =dFactory.newDocumentBuilder();Document doc;doc=builder.parse(new File("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;}}
}

4.2配置文件config.xml

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

5、结果

5.1(第一问)通过修改配置文件config.xml得到不同结果

5.2(第二问)通过添加具体工厂3再修改配置文件config.xml得到结果

具体工厂类ZC32TitleFactory3(主题工厂3类)

public class ZC32TitleFactory3 implements ZC32TitleFactory{public ZC32Typeface produceTypeface() {return new  ZC32Typeface2();}public ZC32Wallpaper produceWallpaper() {return  new ZC32Wallpaper1();}public ZC32LSWallpaper produceLSWallpaper() {return  new ZC32LSWallpaper1();}public ZC32Lcon produceLcon() {return new ZC32Lcon2();}
}

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

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

抽象工厂模式之手机主题相关推荐

  1. 抽象工厂模式--实例分析

    应用场景 某手机操作系统可以根据用户不同的喜好在多种主题之间进行切换,随着主题的变化,系统中的字体.app图标.壁纸.锁屏壁纸等元素会随之发生变化. 使用抽象工厂模式设计手机主题库 创建元素接口 // ...

  2. 抽象工厂模式java_Java之抽象工厂模式(Abstract Factory)

    1.设计意图 提供一个接口,用于创建相关或者从属对象的族,而不是指定他们的具体类.以下以生产计算机为例给出UML类图: 2.演示案例 假设我们要生产一台计算机(广义的),一台计算机有一些共同的物件.小 ...

  3. 抽象工厂模式[读书笔记]

    在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可以提供多 ...

  4. Python—程序设计:抽象工厂模式

    抽象工厂模式 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象. 例:生产一部手机,需要手机壳.CPU.操作系统三类对象进行组装,其中每类对象都有不同的种类.对每个具体工厂,分别生 ...

  5. 【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

    文章目录 一.抽象工厂模式简介 二.抽象工厂模式适用场景 三.抽象工厂模式优缺点 四.产品等级结构和产品族 五.抽象工厂模式代码示例 1.冰箱抽象类 2.美的冰箱实现类 3.格力冰箱实现类 4.空调抽 ...

  6. 抽象工厂模式(JAVA反射)

    实例代码(JAVA):模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是 ...

  7. 工厂方法模式与抽象工厂模式

    本文是转的 一.引子        话说十年前,有一个暴发户,他家有三辆汽车--Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说&quo ...

  8. 设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. 工厂三兄弟之抽象工厂模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/9319181 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但 ...

  10. 抽象工厂模式_抽象工厂模式

    抽象工厂模式其实是围绕了一个超级工厂创建其他的工厂(可参考工厂模式).这个超级工厂又可以想像成是其他工厂的工厂,这种设计模式是一种创建型模式.在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要 ...

最新文章

  1. 不是同一个工程的exe与dll,如何调试dll
  2. javascript系统时间
  3. 使用Azure云原生构建博客是怎样一种体验?(下篇)
  4. 比1亿像素还要更厉害!三星Galaxy S11相机应用代码泄露天机...
  5. MSSQLSERVER数据库- 配置数据库邮件配置的操作过程
  6. Java多线程系列--“JUC锁”07之 LockSupport
  7. SIR模型和Python实现
  8. 单例模式简单示例与优化
  9. 产品读书《About Face 3交互设计精髓》
  10. HZRecorder+科大讯飞语音转换文字
  11. 提出辞职可以用的五个理由推荐给大家
  12. 计算机中ufc是什么意思中文,ufc是什么意思,ufc是什么意思中文
  13. 基于FPGA实现的DDS双通道信号发生器
  14. opencv(python)使用ann神经网络识别手写数字
  15. Jetson Nano使用yolov4-Tiny进行目标检测
  16. 一个扫描器搞定TCP协议所有问题
  17. vue校验密码的三种写法
  18. 用 matplotlib 做交互式的票房分析
  19. matlab怎么输入二维数组,MATLAB二维数组(矩阵)的创建
  20. 深度学习中的注意力机制(2017版)

热门文章

  1. SSA静态单赋值概念理解
  2. Kubernetes 学习路径
  3. 计算机硬盘中有许多碎片,电脑磁盘碎片整理有什么用(需要经常清理吗)
  4. 离散——在谓词演算的推理过程中为什么要先消去存在量词再消去全称量词
  5. dvwa页面打不开的原因_细看网页打不开的解决办法以及原因细看
  6. 考研计算机320分什么水平,考研320分算什么水平,能上211、985吗?很多人都答不上...
  7. anaconda出现Multiple Errors Encountered.
  8. 互联网+房地产最后拼什么?除了技术还是技术
  9. android自定义键盘 下划线,TabLayout 自定义下划线
  10. 反病毒工具-WinDBG