简单工厂(Simple Factory,创建型模式)
第一步:
比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用,但是我们发现Apple和Banana都有采集get的方法,所以我们使用Fruit接口进行抽象出来,接口中有一个get方法,然后由Apple类和Banana类去实现,在调用的使用我们就可以使用多态了
第二步:
我们发现每次都需要自己去new一个Apple和Banana,感觉不爽,于是我们就去新建一个FruitFactory工厂类进行封装这个new的过程,分别写了两个静态的getAppleInstance()和getBananaInstance()方法,然后在main方法中通过FruitFactory进行调用
第三步:
我们发现FruitFactory的两个方法都是获取相应的实例,于是我们就将这两个方法封装为一个方法,getFruitInstance(String className)进行获取相应的实例调用。采用的是if else判断className来获取实例
第四步:
我们将getFruitInstance(String className)方法进行改进,使用反射的机制根据传入的类的全名称来获取实例,缺点是调用者必须要知道类的全名称是什么。
以上四步就是简单工厂的基本使用
代码实现如下:
Apple.java
package com.designpattern.simplefactory; public class Apple implements Fruit{ public void get(){ System.out.println("采集苹果"); } }
Banana.java
package com.designpattern.simplefactory; public class Banana implements Fruit{ public void get(){ System.out.println("采集香蕉"); } }
Fruit.java
package com.designpattern.simplefactory; public interface Fruit { public void get(); }
FruitFactory.java
package com.designpattern.simplefactory; public class FruitFactory { // public static Fruit getAppleInstance(){ // return new Apple(); // } // // public static Fruit getBananaInstance(){ // return new Banana(); // } public static Fruit getFruitInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ // if(className.equalsIgnoreCase("Apple")){ // return new Apple(); // } // else if(className.equalsIgnoreCase("Banana")){ // return new Banana(); // } // else { // System.out.println("没有该类型的实例"); // return null; // } //使用反射机制,必须知道类的全名称 Class class1 = Class.forName(className); return (Fruit)class1.newInstance(); } }
MainClass.java
package com.designpattern.simplefactory; public class MainClass { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { /* * 使用了多态,因为这里需要new 一个实例对象,所以使用工厂封装方法 */ // Fruit apple = new Apple(); // apple.get(); // Fruit banana = new Banana(); // banana.get(); /* * 通过工厂调用各自的方法获取实例 */ // Fruit apple = FruitFactory.getAppleInstance(); // apple.get(); // Fruit banana =FruitFactory.getBananaInstance(); // banana.get(); /* * 进一步封装实例方法使用 */ Fruit apple = FruitFactory.getFruitInstance("com.designpattern.simplefactory.Apple"); apple.get(); Fruit banana =FruitFactory.getFruitInstance("com.designpattern.simplefactory.Banana"); banana.get(); } }
一、什么是简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
二、简单工厂模式的优缺点
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。