抽象工厂模式之手机主题
抽象工厂模式之手机主题
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(第四问) 在抽象工厂模式里,如果只是增加一个新的产品,比如改题目增加一个主题,只需要增加相应的具体工厂就行,再将配置文件里的具体工程类类名改成新增的工厂类类名,原有代码无需修改,但是要增加一种新的产品,即通讯录也随主题变化而变化,那么原有类名需要较大的修改,在抽象工厂里需要声明一个通讯录的方法,所有的具体工厂类都需要实现该方法,将导致系统不再符合“开放原则”。
年轻
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了