Java工厂设计模式
来源:互联网 发布:倚天屠龙记星河源码 编辑:程序博客网 时间:2024/05/22 16:04
1. 简单工厂
interface Car{}class BMWCar implements Car{ BMWCar(){ System.out.println("宝马车被制造了。。"); }}class AudiCar implements Car{ AudiCar(){ System.out.println("奥迪车被制造了。。"); }}public class SimpleCarFactory { public static final int BMWCAR = 1; public static final int AUDICAR = 2; public static Car produceCar(int carType) throws Exception{ switch (carType) { case BMWCAR: return new BMWCar(); case AUDICAR: return new AudiCar(); default: throw new Exception("没有这种车"); } } public static void main(String[] args) { try { SimpleCarFactory.produceCar(SimpleCarFactory.BMWCAR); } catch (Exception e) { e.printStackTrace(); } }}
上面的代码实现了一个简单工厂,传入需要制造的车的类型返回相应的实例,但是简单工厂存在许多缺陷,首先,添加新的车的种类的时候需要修改源代码。其次,也是最大的缺点就是整个系统全都依赖SimpleCarFactory,如果SimpleCarFactory类一旦出现问题,那么整个系统就变成了瘫痪状态。我们可以通过下面两种方式来谋求解决方案。
2. 工厂方法
重复代码我就不写了,看简单工厂代码interface Factory{ Car create();}class BMWCarFactory implements Factory{ @Override public Car create() { return new BMWCar(); }}class AudiCarFactory implements Factory{ @Override public Car create() { return new AudiCar(); }}public class TestFactory { public static void main(String[] args) { Factory factory = new BMWCarFactory(); factory.create(); }}
工厂方法有效的解决了上面简单工厂存在的问题,如果新加入一个车和一个车的工厂不需要更改源代码,而且如果一个工厂类出现了问题不会影响到其他工厂类的使用。
新添加一个车和工厂
class AUTOCar implements Car{ AUTOCar(){ System.out.println("奥拓车被制造了。。"); }}class AUTOCarFactory implements Factory{ @Override public Car create() { return new AUTOCar(); }}
目前为止已经解决了上面的问题,下面问题又来了,因为相同的车同样还有型号不同的时候,不同型号的车的配件各有不同,可以通过抽象工厂来解决。
3. 抽象工厂
interface Car{}abstract class BMWCar implements Car {}class BMWX3 extends BMWCar { BMWX3() { System.out.println("BMWX3车被制造了。。"); }}class BMWX5 extends BMWCar { BMWX5() { System.out.println("BMWX5车被制造了。。"); }}interface Chair{}class BMWX3Chair implements Chair{ BMWX3Chair() { System.out.println("BMWX3的座椅被制造了。。"); }}class BMWX5Chair implements Chair{ BMWX5Chair() { System.out.println("BMWX5的座椅被制造了。。"); }}interface Window{}class BMWX3Window implements Window{ BMWX3Window() { System.out.println("BMWX3的车窗被制造了。。"); }}class BMWX5Window implements Window{ BMWX5Window() { System.out.println("BMWX5的车窗被制造了。。"); }}interface Factory { Car create();}abstract class BMWCarFactory implements Factory { abstract Chair createChair(); abstract Window createWindow();}class BMWX3CarFactory extends BMWCarFactory{ @Override public Car create() { return new BMWX3(); } @Override Chair createChair() { return new BMWX3Chair(); } @Override Window createWindow() { return new BMWX3Window(); }}class BMWX5CarFactory extends BMWCarFactory{ @Override public Car create() { return new BMWX5(); } @Override Chair createChair() { return new BMWX5Chair(); } @Override Window createWindow() { return new BMWX5Window(); }}public class TestAbstractFactory { public static void main(String[] args) { BMWCarFactory factory = new BMWX3CarFactory(); factory.createWindow(); factory.createChair(); factory.create(); }}
总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
0 0
- java 设计工厂模式
- Java 工厂模式设计
- JAVA工厂设计模式
- JAVA 工厂设计模式
- java工厂设计模式
- Java工厂设计模式
- java工厂设计模式
- Java 工厂模式设计
- java工厂设计模式
- Java工厂设计模式
- [Java]工厂设计模式
- java工厂设计模式
- java 工厂设计模式
- java 工厂设计模式
- Java工厂设计模式
- Java工厂设计模式
- java---工厂设计模式
- Java工厂设计模式
- java版蓝缘官网商业源码出售
- 8. wordpress源码解析-目录结构-文件调用关系(1)
- 安卓中使用fresco加载Gif图片
- Stimulsoft报表工具2015.3版本全线更新发布
- UVA 10474 大理石在哪里
- Java工厂设计模式
- 通过协议和代理实现买水的功能
- Linux段页式管理思想--写操作系统内存管理必备知识,简单易懂
- Android Studio——外部类监听事件
- JAVA生成指定位数不重复的随机数,随机数含0-9、A-Z
- SRM675 div2 hard TreeAndPathLength2(DP)
- 【Android】google plus、Facebook登陆sdk集成打包出aar的使用步骤
- 实战c++中的vector系列--可怕的迭代器失效(vector重新申请内存)
- svn服务器搭建