Java设计模式之创建型模式-抽象工厂模式(Abstract Factory)
来源:互联网 发布:手机找工作软件 编辑:程序博客网 时间:2024/05/21 10:28
关于设计模式的学习,中间断开也有一段时间了,现在继续补上。
刚接触这个模式的时候其实也和工厂模式搞混了,不过静下心来仔细地理理也算清楚了。
在开始讲抽象工厂模式之前,我这里先引入两个概念(刚开始绕了半天),以便更好地了解抽象工厂模式(例子我还是用之前讲工厂模式小米和苹果的例子):
产品层次结构: 产品层次结构就是产品的继承结构。比如我们有一个抽象类或者接口是手机,它的子类有苹果手机、小米手机、华为手机等具体的手机,那么抽象的手机和具体的手机这便构成了一个产品层次结构。抽象手机作为父类或者父接口,而具体品牌的手机则作为其子类。
产品族: 在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品层次结构中的一组产品。比如苹果电子工厂生产的苹果手机、苹果电脑,苹果手机位于手机产品层次结构中,苹果电脑位于电脑产品层次结构中,那么苹果手机和苹果电脑就构成了一个产品族。
抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们的具体的类,从而创建多个产品族中的产品对象。
满足条件
抽象工厂模式需要满足以下的条件:
1. 系统当中有多个产品族,而且系统一次只可能消费其中一族产品;
2 . 同属于同一个产品族的产品以供其使用;
实现方式
1.创建一个Phone接口(抽象类,普通Java类都行)
public interface Phone { void call();}
2.创建实现Phone接口的具体产品类IPhone、MiPhone
public class IPhone implements Phone { public void call() { System.out.println("IPhone call..."); }}
public class MiPhone implements Phone { public void call() { System.out.println("MiPhone call..."); }}
3.创建一个Computer接口
public interface Computer { void play();}
4.创建实现Computer接口的具体产品类IComputer、MiComputer
public class IComputer implements Computer { @Override public void play() { System.out.println("IComputer play..."); }}
public class MiComputer implements Computer { @Override public void play() { System.out.println("MiComputer play..."); }}
5.创建一个抽象的工厂Factory
public interface Factory { Phone createPhone(); Computer createComputer();}
6.创建实现Factory接口的具体工厂类IFactory、MiFactory
public class IFactory implements Factory { @Override public Phone createPhone() { return new IPhone(); } @Override public Computer createComputer() { return new IComputer(); }}
public class MiFactory implements Factory { @Override public Phone createPhone() { return new MiPhone(); } @Override public Computer createComputer() { return new MiComputer(); }}
7.抽象工厂测试类
public class AbstractFactoryTest { public static void main(String[] args) { Factory f = new IFactory(); Computer c = f.createComputer(); c.play(); }}
这里跟我之前引入概念中所说的一样,IPhone和MiPhone属于同一产品层次结构,同理IComputer和MiComputer也一样。而IPhone和IComputer属于同一产品族。
缺点与不足
我们在使用抽象工厂模式的时候,但凡我们需要增加新的产品层次结构,我们就需要新增原有层次结构对应数量的产品类,同时还要修改对应数量的工厂类,这样大批量的修改显然是不合适的。
优化改进
针对上述的问题,利用简单工厂和反射结合的方式来改进抽象工厂:
上述步骤1.2.3.4保持不变。我们从上述步骤5.创建一个抽象的工厂Factory开始做修改。
public class Factory { public static Phone createPhone(Class clazz) throws Exception { return (Phone) clazz.newInstance(); } public static Computer createComputer(Class clazz) throws Exception { return (Computer) clazz.newInstance(); }}
之前的步骤6我们也不需要了,直接写个抽象工厂测试类测试下:
public class AbstractFactoryTest { public static void main(String[] args) throws Exception { Computer c = Factory.createComputer(MiComputer.class); c.play(); }}
输出:
MiComputer play...
- Java设计模式之创建型模式-抽象工厂模式(Abstract Factory)
- 设计模式-创建型模式之 Abstract Factory(抽象工厂)
- 创建型设计模式之抽象工厂(Abstract Factory)模式
- 【设计模式】创建型模式之抽象工厂Abstract Factory
- 设计模式-创建型-抽象工厂模式(Abstract Factory)
- Java设计模式之抽象工厂(Abstract Factory)模式
- JAVA设计模式之抽象工厂(Abstract Factory)模式
- 【java设计模式】之 抽象工厂(Abstract Factory)模式
- 【java设计模式】之 抽象工厂(Abstract Factory)模式
- 【java设计模式】之 抽象工厂(Abstract Factory)模式
- C++设计模式 -> 创建型 -> 抽象工厂(Abstract Factory)
- 创建型模式之抽象工厂模式(Abstract Factory)- 工厂方法模式(Factory Method)
- 设计模型之创建型模式之抽象工厂模式(Abstract Factory)
- Java:设计模式之抽象工厂模式(Abstract Factory)
- JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】
- Java开发之设计模式--抽象工厂模式(Abstract Factory)
- JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】
- 设计模式之 抽象工厂(Abstract Factory)---对象创建型模式
- servlet单实例多线程模式
- C# 对字符串进行分离 split 字符串分割 "aaaa---bbbb---ccc"方法
- POJ 1789 Truck History (Prim算法求最小生成树)
- 2010 浙大机试 奥运排序问题
- python实现的简单图像矩阵变换
- Java设计模式之创建型模式-抽象工厂模式(Abstract Factory)
- Struts2中由doubleselect标签引发的问题
- takePicture failed takePicture失败
- java网页正则表达式爬虫(用纯java代码在相应的网页中查看自己想要的内容)
- 调整字符串中文格式
- 2011 浙大机试 A+B for Matrices
- 解决“Spring 使用MapperScannerConfigurer无法读取*.properties文件"的问题
- 学以致用-使用分类汇总分析股价与时间维度(年、月、日、星期)的关系(Excel+Spotfire)
- CSU 1547: Rectangle