设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

简单工厂(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

设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
package com.designpattern.simplefactory;

public class Apple implements Fruit{
    public void get(){
        System.out.println("采集苹果");
    }
}
设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

Banana.java

设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
package com.designpattern.simplefactory;

public class Banana implements Fruit{
    public void get(){
        System.out.println("采集香蕉");
    }
}
设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

Fruit.java

package com.designpattern.simplefactory;

public interface Fruit {
    public void get();
}

FruitFactory.java

设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
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();
    }
}
设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

MainClass.java

设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
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();
        
    }

}
设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

 

一、什么是简单工厂模式

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

二、简单工厂模式的优缺点

在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

上一篇:java基础-容器


下一篇:compiler,gold parser,DFA,LALR