天天看点

java设计模式一之简单工厂设计模式

前言:

简单工厂设计模式用来专门创建其他类的实例,这些类具有共同的特点。也被称为静态工厂类

怎么设计:

1、需要实体类:要被创建的类

2、被创建的类的共同父类:多态的体现,负责所有实例的公共接口,在工厂类中接收实体对象

3、工厂类:创建实体类

代码:

1、公共的父类,水果类

package com.xhx.designpattern;

public interface Fruit {
    /**
     * 水果
     */
    void get();
}      

2、香蕉类,继承水果类

package com.xhx.designpattern;

public class Banana implements Fruit{
    public void get(){
        System.out.println("我是香蕉");
    }
}      

3、苹果类、继承水果类

package com.xhx.designpattern;

public class Apple implements Fruit{
    public void get(){
        System.out.println("我是苹果");
    }
}      

4、工厂类

下面我举例了三种工厂

a.

没有入参,通过方法名字,区分创建的实体类。

缺点,每次增加新的实体类,都需要加一个方法

package com.xhx.designpattern;

public class FruitFactory {
    /*
    获得实例
     */

    public static Fruit getApple(){
        return new Apple();
    }

    public  static Fruit getBanana(){
        return new Banana();
    }

}      

b.

入参为实体类名称的字符串

缺点,每次增加一个新的实体类,都需要加一个判断

package com.xhx.designpattern;

public class FruitFactory2 {

    public static Fruit getFruit(String type) throws IllegalAccessException, InstantiationException {
        if(type.equalsIgnoreCase("apple")){
            return new Apple();
        } else if (type.equalsIgnoreCase("banana")) {
            return new Banana();
        }else {
            return null;
        }
    }
}      

c.

通过反射

通过反射获取,新增实体类无影响

package com.xhx.designpattern;

import java.util.concurrent.Future;

public class FruitFactory3 {

    public static Fruit getFruit(String type) throws Exception {
        Class fruit = Class.forName(type);
        return (Fruit)fruit.newInstance();
    }
}      
调用方法:
package com.xhx.designpattern;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) throws Exception {

        Fruit apple1 = new Apple();
        Fruit banana1 = new Banana();

        apple1.get();
        banana1.get();

        System.out.println("-------------");


        //第一个工厂
        Fruit apple2 = FruitFactory.getApple();
        Fruit banana2 = FruitFactory.getBanana();
        apple2.get();
        banana2.get();
        System.out.println("-------------");

        //第二个工厂
        Fruit apple = FruitFactory2.getFruit("apple");
        apple.get();
        System.out.println("-------------");


        //第三个工厂
        Fruit fruit = FruitFactory3.getFruit(Apple.class.getName());
        fruit.get();
        System.out.println("-------------");


    }

}      

继续阅读