工厂模式解析

一、简述

工厂模式有三种类型,分别为简单工厂、工厂方法和抽象工厂
简单工厂模式:在工厂类中,根据条件决定一个接口是由那个具体的产品类来实现。
工厂方法:创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法。用户决定使用哪个工厂。
抽象工厂:对工厂方法进行扩展。各个工厂类中,再增加一个获得接口B实例的方法。

1、简单工厂
概念

定义一个产品的接口或抽象类,其他产品类都实现或基础该接口或抽象类,再定一个工厂类,作用主要就是用来判断用户传递过来的条件产生不同的产品对象。简单的类图如下:
这里写图片描述

具体代码

首先定义一个产品的接口,例如如下:

public interface Operation {
    int getResult(int a, int b);
}

让这些产品都实现该接口

public class OperationAdd implements Operation{
    @Override
    public int getResult(int a, int b) {
        return a+b;
    }
}
public class OperationSub implements Operation{
    @Override
    public int getResult(int a, int b) {
        return a-b;
    }
}

下面定义一个工厂类

public class OperationFactory {

    public static Operation createOperation(String operate){
        Operation operation = null;
        switch (operate){
            case "+":
                operation = new OperationAdd();
            case "-":
                operation = new OperationAdd();
        }
        return operation;
    }

}

以上即为一个简单工厂模式,客户端实例如下

public class TestMain {

    public static void main(String[] args){
        Operation operation = OperationFactory.createOperation("+");
        int result = operation.getResult(1,3);
        System.out.println(result);

    }

}
总结
优点

1、当需要再次增加一个产品类的时候,不需要改动其他产品类,只需要增加本产品类即可。调用方不需要知道具体的产品类实现细节。

缺点

1、但是也需要设计到修改OperationFactory中的方法。这有些违背面向对象设计原则之一OCP(开闭原则);
2、工厂类很关键,如果工厂类出现问题,会导致整个程序出现问题。

2、工厂方法
概念

工厂方法其实是基于简单工厂之上,对于每种产品都增加对应工厂类,每个工厂类都实现或继承共同的工厂接口或抽象类。具体类图如下:
这里写图片描述

具体代码

首先定义一个产品的接口,例如如下:

public interface Operation {
    int getResult(int a, int b);
}

让这些产品都实现该接口

public class OperationAdd implements Operation{
    @Override
    public int getResult(int a, int b) {
        return a+b;
    }
}
public class OperationSub implements Operation{
    @Override
    public int getResult(int a, int b) {
        return a-b;
    }
}

下面定义一个工厂类

public class OperationFactory {

    public static Operation createOperation(String operate){
        Operation operation = null;
        switch (operate){
            case "+":
                operation = new OperationAdd();
            case "-":
                operation = new OperationAdd();
        }
        return operation;
    }

}

以上即为一个简单工厂模式,客户端实例如下

public class TestMain {

    public static void main(String[] args){
        Operation operation = OperationFactory.createOperation("+");
        int result = operation.getResult(1,3);
        System.out.println(result);

    }

}
总结
优点

1、当需要再次增加一个产品类的时候,不需要改动其他产品类,只需要增加本产品类即可。调用方不需要知道具体的产品类实现细节。

缺点

1、但是也需要设计到修改OperationFactory中的方法。这有些违背面向对象设计原则之一OCP(开闭原则);

2、工厂类很关键,如果工厂类出现问题,会导致整个程序出现问题。

3、抽象工厂

抽象工厂模式比工厂方法又复杂一层,主要是为了解决当存在多个不同的抽象产品时的情况,即当有多个产品接口或产品抽象类时,每一个工厂类可以创建多个产品,同时所有的工厂类又拥有同一个抽象工厂类。抽象工厂模式针对的是多个产品等级结果。具体类图如下:
这里写图片描述

具体代码

根据类图,相信脑海中能够构造出对应的代码,此处就不再粘贴大段代码。

总结
优点

1、当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。

缺点

1、当增加某一类型的产品的时候,这就涉及到需要修改抽象工厂类,从而涉及到需要修改抽象工厂类下的所有子类。

参考文献

《大话设计模式》

http://blog.sina.com.cn/s/blog_15eb6937f0102xgp0.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值