Java设计模式之工厂设计模式
2015-10-06 00:05
519 查看
面试题,说一下工厂设计模式:
发一篇博客来总结一下:
上面的代码实现了一个简单工厂,传入需要制造的车的类型返回相应的实例,但是简单工厂存在许多缺陷,首先,添加新的车的种类的时候需要修改源代码。其次,也是最大的缺点就是整个系统全都依赖SimpleCarFactory,如果SimpleCarFactory类一旦出现问题,那么整个系统就变成了瘫痪状态。我们可以通过下面两种方式来谋求解决方案。
工厂方法有效的解决了上面简单工厂存在的问题,如果新加入一个车和一个车的工厂不需要更改源代码,而且如果一个工厂类出现了问题不会影响到其他工厂类的使用。
新添加一个车和工厂
目前为止已经解决了上面的问题,下面问题又来了,因为相同的车同样还有型号不同的时候,不同型号的车的配件各有不同,可以通过抽象工厂来解决。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
发一篇博客来总结一下:
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(); } }
总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
相关文章推荐
- 从赵本山的小品联想到的Java设计模式
- JAVA设计模式学习第三天 设计模式之Chain of Responsibility——项目篇
- 学习:java设计模式—工厂模式
- 设计模式----简单工厂模式
- Java设计模式 创建模式-工厂模式(Factory)
- Java设计模式 创建模式-原型模式(Prototype)
- Java设计模式 创建模式-生成器模式(Builder)
- Java设计模式 创建模式-单态模式(Singleton)
- Java设计模式 结构模式-适配器模式(Adapter)
- 《Java设计模式》七大原则
- 设计模式-创建型:单例模式(1)
- java设计模式(二):2.1责任链(简单一条链)
- java 设计模式有趣见解
- 黑马程序员————java设计模式之单例模式一
- Java 观察者模式
- 利用Happen-Before规则分析DCL
- java设计模式之抽象工厂模式
- 抽象工厂模式浅谈
- 生成器模式浅谈
- 简单工厂模式浅谈