前言:
简单工厂设计模式用来专门创建其他类的实例,这些类具有共同的特点。也被称为静态工厂类
怎么设计:
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("-------------");
}
}