您的位置:首页 > 编程语言 > Java开发

Java设计模式之工厂设计模式

2015-10-06 00:05 519 查看
面试题,说一下工厂设计模式:

发一篇博客来总结一下:

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设计模式