java设计模式-工厂模式

工厂模式

工厂模式是java中23种设计模式之一,在spring中bean管理使用了大量的工厂模式,为了能够更好的理解spring源码,在此温馨下工厂设计模式,希望能够借此温故而知新。

工厂模式分类

工厂模式分为三类:简单工厂,工厂方法,抽象工厂。

1.简单工厂模式,又称静态工厂方法模式。(此模式用得比较少)

​ 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。

示例:

public interface Fruit { 
    void eat();
}
public class Apple implements Fruit {
    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}
public class Banana implements Fruit{
    @Override
    public void eat() {
        System.out.println("吃香蕉");
    }
}

//创建FruitFactory工厂类: 这样就可以通过工厂类的getFruit()类获取需要的对象了。

public class FruitFactory {
    public static Fruit getFruit(String name) throws Exception {
        if (name.equalsIgnoreCase("apple")){
            return Apple.class.newInstance();
        }else if (name.equalsIgnoreCase("banana")){
            return Banana.class.newInstance();
        }else {
            return null;
        }
    }
}

​ 总结:这样的代码个人感觉没啥好处,除了代码逻辑美观。但它的作用就是不需要过多关心对象是如何构建的,直接调用即可,有点想原生的jdbc写法。

2.工厂方法模式,又称多态工厂模式。

​ 工厂方法模式是对简单工厂模式的抽象升级,将工厂这个概念抽象出来成为接口,然后针对每种目标实现类创建一个工厂实现,一对一来实现,当新增了目标实现,只要同时新增一个工厂实现即可。

示例:同样引用上面的Fruit接口和实现类

//定义一个水果工厂接口
public interface FruitFactory{
	Fruit createFruit();
}
//定义一个苹果工厂类实现水果工厂接口
public class AppleFactory implements FruitFactory{
    @Override
    public Fruit careateFruit() {
        return new Apple();
    }
}
//定义一个香蕉工厂类实现水果工厂接口
public class BananaFactory implements FruitFactory{
    @Override
    public Fruit careateFruit() {
        return new Banana();
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        FruitFactory factory = new BananaFactory();
        Fruit fruit = factory.createFruit();
        System.out.println(fruit.eat());
    }
}
输出结果:吃香蕉

总结:目标可以无限扩展,工厂类也要随之扩展,一对一存在,满足了开闭原则,缺点也十分明显。mybatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式。

3.抽象工厂模式,又称工具箱模式。

​ 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

//定义抽象产品及其实现类
abstract Fruit { 
    public abstract void eat();
}
public class Apple implements Fruit {
    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}
public class Banana implements Fruit{
    @Override
    public void eat() {
        System.out.println("吃香蕉");
    }
}

//定义一个抽象水果工厂及其实现类
abstract FruitFactory{
	public abstract Fruit createFruit();
}
public class AppleFactory implements FruitFactory{
    @Override
    public Fruit careateFruit() {
        return new Apple();
    }
}
public class BananaFactory implements FruitFactory{
    @Override
    public Fruit careateFruit() {
        return new Banana();
    }
}

总结:使对象的创建被实现在工厂接口所暴露出来的方法中。

最后:

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值