设计模式之简单工厂模式

来源:互联网 发布:淘宝双11海景房氛围图 编辑:程序博客网 时间:2024/06/16 07:41

Java是面向对象的编程语言,说到对象,不可避免的就是创建对象,java创建对象是通过new操作符来创建类的实例。本文所讲的简单工厂模式就属于类的创建型模式,又叫静态工厂模式。

什么是简单工厂模式?简单工厂模式的概念是什么?

简单工厂模式属于类的创建型模式,又叫静态工厂模式,通常会专门定义一个类来负责创建其他类的实例,也正因此被创建的类实例都会具有共同的父类。

举一个简单的例子:

创建一个Apple类、Banana类,定义它们的get方法

public class Apple {public void get() {System.out.println("采集苹果");}}
public class Banana {public void get() {System.out.println("采集香蕉");}}

因为Apple、Banana属于水果,因此再创建一个Fruit接口,将Apple、Banana类中具体的get()抽离出来(此处也是java三大特性--多态的具体应用场景):

/** * 将Apple、Banana抽象成Fruit接口 * @author  * */public interface Fruit {public void get();}

有了Fruit接口后,将Apple、Banana两个类实现Fruit接口,创建Apple、Banana实例:

Fruit apple = new Apple();Fruit banana = new Banana();apple.get();banana.get();

如果再多出一个葡萄类,那么创建葡萄实例也必须通过new操作符类实现,这个时候就在想我们能否只创建一个类,这个类就负责专门用来创建其他类的实例,即创建其他所有类实例的逻辑在这个类里实现,外部只需直接调用这个类的内部实现方法就能创建所需的类实例,外部调用并不显示创建对象的具体内部逻辑。由此引出了简单工厂模式中的一个非常重要的角色:工厂角色。工厂角色是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,工厂类可以直接被外部调用,创建所需的实例。

创建工厂类:

public class FruitFactory {//1.创建Apple实例的实现逻辑public static Fruit getApple() {return new Apple();}//2.创建Banana实例的实现逻辑public static Fruit getBanana() {return new Banana();}}

外部直接引用这个工厂类,调用其内部的静态方法,就能实现创建对象的具体操作

//引用工厂类,调用静态方法,创建对象Fruit apple = FruitFactory.getApple();Fruit banana = FruitFactory.getBanana();apple.get();banana.get();

由上述代码不难看出,外部的调用并没有暴露对象创建的内部逻辑,因为对象的创建是由工厂类统一负责实现。

到此为止,一个简单工厂模式已经初步成型。正如前文所述,如需再创建一个葡萄实例,那就不得不在这个工厂类里添加创建Grape实例的实现逻辑,此时FruitFactory工厂类的可扩展性是很差的,因此还要对FruitFactory工厂类进行代码可扩展性的优化。

考虑能否在这个工厂类里只写一个创建实例的具体实现,不管外部需要创建哪个具体类的对象,在工厂类里只需根据外部给定的具体信息作必要的判断逻辑就能创建所需的对象?可以对FruitFactory这个工厂类代码作如下优化:

public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {if(type.equalsIgnoreCase("apple")) {return Apple.class.newInstance();} else if(type.equalsIgnoreCase("banana")) {return Banana.class.newInstance();} else {System.out.println("找不到对应的产品类");return null;}}
上述优化后的工厂类内部只有一个创建对象的实现,较前文那几种方法在扩展性上有了一定的改善,但是内部逻辑本质上还是new操作符,而且随着所需创建对象的增多,同样还是要在方法内部添加else if分支。也正是这样,想到了动态加载类来创建实例的方法:
public static Fruit getFruit(String type) throws ClassNotFoundException {Class fruit = Class.forName(type);return (Fruit) fruit.newInstance();}
到这一步为止,getFruit(String type)这个方法可以说是集中了所有实例的创建逻辑,外部直接引用这个工厂类,调用上述这个方法,把类名作为参数传入,就可创建对应的实例。

原创粉丝点击