抽象工厂模式
2016-03-24 16:08
381 查看
比工厂方法模式 的抽象程度更高,这个模式中,具体工厂可以生产相关的一组具体产品,
这样的一组产品称之为产品族,产品族中的每一个产品都分属于某一个产品继承等级结构。
下面举例:电器工厂
一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,
TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,
而相同类型的电器够成了一个产品等级结构。
源码下载:下载地址
配置文件,若生产海尔电视机和空调直接修改此文件即可
这样的一组产品称之为产品族,产品族中的每一个产品都分属于某一个产品继承等级结构。
下面举例:电器工厂
一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,
TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,
而相同类型的电器够成了一个产品等级结构。
源码下载:下载地址
package com.th.designedmodemofchouxianggongchang; /******** * 抽象产品类Television(电视机类) * 它可以是一个接口,也可以是一个抽象类 * 其中包含业务方法 play() 的声明 */ public interface Television { public void play(); }
package com.th.designedmodemofchouxianggongchang; /****** * HaierTelevision 是 Television 的子类 * 实现了在 Television 中定义的业务方法 play() * */ public class HaierTelevision implements Television { @Override public void play() { System.out.println("海尔电视机播放中......"); } }
package com.th.designedmodemofchouxianggongchang; /***** * TCLTelevision 是 Television 的另一个子类 * 也实现了在 Television 中定义的业务方法 play() * */ public class TCLTelevision implements Television { @Override public void play() { System.out.println("TCL电视机播放中......"); } }
package com.th.designedmodemofchouxianggongchang; /******* * AirConditioner 是另一种抽象产品类, * 它可以是一个接口,也可以是一个抽象类 * 其中包含业务方法 changeTemperature() 的声明 * */ public interface AirConditioner { public void changeTemperature(); }
package com.th.designedmodemofchouxianggongchang; /****** * HaierAirConditioner 是 AirConditioner 的子类 * 实现了在 AirConditioner 中定义 的业务方法 changeTemperature() * */ public class HaierAirConditioner implements AirConditioner { @Override public void changeTemperature() { System.out.println("海尔空调温度改变中......"); } }
package com.th.designedmodemofchouxianggongchang; /****** * TCLAirConditioner 也是 AirConditioner 的子类 * 实现了在 AirConditioner 中定义 的业务方法 changeTemperature() * */ public class TCLAirConditioner implements AirConditioner { @Override public void changeTemperature() { System.out.println("TCL空调温度改变中......"); } }
package com.th.designedmodemofchouxianggongchang; /* * 抽象工厂类,定义了抽象工厂方法 * 针对每一个产品族 的产品都提供了一个对应的工厂方法 * */ public interface EFactory { public Television produceTelevision(); public AirConditioner produceAirConditoner(); }
package com.th.designedmodemofchouxianggongchang; /***** * HaierFactory 是 EFactory 的一个子类 * 实现了在 EFactory 中定义的工厂方法,用于创建具体产品对象 * HaierFactory 所生产的具体产品构成了一个产品族 * */ public class HaierFactory implements EFactory { @Override public Television produceTelevision() { return new HaierTelevision(); } @Override public AirConditioner produceAirConditoner() { return new HaierAirConditioner(); } }
package com.th.designedmodemofchouxianggongchang; /***** * TCLFactory 也是 EFactory 的一个子类 * 实现了在 EFactory 中定义的工厂方法,用于创建具体产品对象 * TCLFactory 所生产的具体产品构成了一个产品族 * */ public class TCLFactory implements EFactory { @Override public Television produceTelevision() { return new TCLTelevision(); } @Override public AirConditioner produceAirConditoner() { return new TCLAirConditioner(); } }
package com.th.designedmodemofchouxianggongchang; import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class XMLUtil { public static Object getBean() { try { 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().trim(); Class c = Class.forName(cName); Object obj = c.newInstance(); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } }
package com.th.designedmodemofchouxianggongchang; /***** * 客户端测试类 Client * */ public class Client { public static void main(String[] args) { try { EFactory factory; Television tv; AirConditioner ac; factory = (EFactory) XMLUtil.getBean(); tv = factory.produceTelevision(); tv.play(); ac = factory.produceAirConditoner(); ac.changeTemperature(); } catch (Exception e) { System.out.println(e.getMessage()); } } }
配置文件,若生产海尔电视机和空调直接修改此文件即可
<?xml version="1.0" ?> <config> <className>com.th.designedmodemofchouxianggongchang.TCLFactory</className> </config>
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用