抽象工厂模式之手机主题

抽象工厂模式之手机主题

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得到不同结果

主题1主题2

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();
	}
}

主题3

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

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

posted @   cxc超小超  阅读(207)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示