创建型模式之三——抽象工厂模式
2015-10-09 12:06
316 查看
模式动机
在工厂方法模式中具体工厂负责生成具体的产品,每一个具体产品对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或一组重载的工厂方法。但是有的时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器设备工厂,它可以生产电视机、电冰箱、空调等设备,而不只是生产某种类型的电器。为了更清晰地理解抽象工厂模式,需要引入两个概念:产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机等,那么抽象电视机和具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:在抽象工厂模式中,产品族是指由同一工厂生产的,位于不同产品等级结构中的一组产品。如海尔工厂生产海尔电视、海尔冰箱等。
模式定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。模式结构
抽象工厂模式结构图如图所示:1.AbstractFactory(抽象工厂)
抽象工厂用于声明生产抽象产品的方法,在一个抽象工厂中可以定义一组方法,每一个方法对应一个产品等级结构。
2.ConcreteFactory(具体工厂)
具体工厂实现了抽象工厂声明的生产抽象产品的方法,生产一组具体方法,这些产品构成一个产品族,每一个产品都位于某个产品等级结构中。
3.AbstractProduct(抽象产品)
抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法。
4.ConcreteProduct(具体产品)
具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口定义中的业务方法。
实例
一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机,海尔空调等,TCL工厂也可以生产对应的电器。如图是该实例类图。
// 抽象产品类 public interface Television { public void play(); } public interface AirConditioner { public void changeTemperature(); } // 具体产品类 public class HaierTelevision implements Television { public void play() { System.out.println("海尔电视机播放中."); } } public class TCLTelevision implements Television { public void play() { System.out.println("TCL电视机播放中."); } } public class HaierAirConditioner implements AirConditioner { public void changeTemperature() { System.out.println("海尔空调控温中"); } } public class HaierAirConditioner implements AirConditioner { public void changeTemperature() { System.out.println("TCL空调控温中"); } } // 抽象工厂类 public interface EFactory { public Television produceTelevision(); public AirConditioner produceAirConditioner(); } // 具体工厂类 public class HaierFactory implements EFactory { public Television produceTelevison() { return new HaierTelevision(); } public AirConditioner produceAirConditioner { return new HaierAirConditioner(); } } public class TCLFactory implements EFactory { public Television produceTelevison() { return new TCLTelevision(); } public AirConditioner produceAirConditioner { return new TCLAirConditioner(); } } // 测试 public class Client { public static void main(String[] args) { Televison tv; AirConditioner airConditioner; EFactory factory = new HaierFactory(); tv = factory.produceTV(); airConditioner = factory.produdeAirConditioner(); tv.play(); airConditioner.changeTemperature(); } }
相关文章推荐
- Android Studio 1.4 NDK 开发中Javah命令找不到类的解决方法
- java常用工具类(三)
- Android Studio项目结构
- 欢迎使用CSDN-markdown编辑器
- java常用工具类(二)
- Python判断IP合法性
- chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
- SeaJS入门
- 使用Areas分离ASP.NET MVC项目
- hdu 4276 The Ghost Blows Light - 树形dp
- Nginx+Tomcat+Memcached部署应用
- JSP验证码简单生成方法
- Java stack转arraylist
- DLL与EXE之间的内存 new 与 delete 上的问题
- 关注的Matlab Toolbox列表(超全)
- LeetCode:Add Digits
- c#已有打开的与此COMMAND相关联的DataReader
- 42. Trapping Rain Water (Array; DP)
- Asp.net MVC23 使用Areas功能的常见错误
- java获得java的变量设置 envSnoop