简单工厂设计模式
建立一个工厂类,对实现了同一接口的类进行实例的创建。简单工厂模式的实质是有由一个工厂类根据传入的参数动态的决定应该创建哪一个实现类。
/*
* 简单工厂设计模式
* */
//抽象接口水果
interface IFruit{
//抽象方法
void eat();
}
//定义Apple类实现接口
class Apple implements IFruit{
public void eat() {
System.out.println("苹果需要削皮吃");
}
}
//定义Orange类实现接口
class Orange implements IFruit{
public void eat() {
System.out.println("橘子需要剥皮吃");
}
}
//定义工厂类,用来创建各实现类
//使用逻辑判断的方式实现
class Factory{
public static IFruit getInstance(String name) {
if(name.equals("Apple")) {
//若判断和Apple相等,则产生Apple类的实例化对象
return new Apple();
}else if(name.equals("Orange")) {
//若判断和Orange相等,则产生Orange类的实例化对象
return new Orange();
}else {
//否则返回null
return null;
}
}
}
public class Test1{
public static void main(String[] args) {
IFruit iFruit1 = Factory.getInstance("Orange");
IFruit iFruit2 = Factory.getInstance("Apple");
iFruit1.eat();
iFruit2.eat();
}
}
通过上述代码我们实现了简单的工厂设计模式,但是当我们每新增一个实现类的时候就需要对工厂类进行修改,由此我们可以利用反射机制对其进行改良,使其实现在新增实现类的同时不需要对工厂类进行修改。
/*
* 反射机制改良简单工厂设计模式
* */
//抽象接口水果
interface IFruit{
//抽象方法
void eat();
}
//定义Apple类实现接口
class Apple implements IFruit{
public void eat() {
System.out.println("苹果需要削皮吃");
}
}
//定义Orange类实现接口
class Orange implements IFruit{
public void eat() {
System.out.println("橘子需要剥皮吃");
}
}
class WaterMelon implements IFruit{
public void eat() {
System.out.println("西瓜切着吃");
}
}
//定义工厂类,用来创建各实现类
//使用逻辑判断的方式实现
class Factory{
private Factory() {}
public static IFruit getInstance(String name) {
IFruit iFruit = null;
try {
//获取Class对象
Class<?> class1 = Class.forName(name);
//创建实例化对象
iFruit = (IFruit) class1.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
//若无此类,则返回null
return iFruit;
}
}
public class Test1{
public static void main(String[] args) {
IFruit iFruit1 = Factory.getInstance("reflect.Apple");
iFruit1.eat();
IFruit iFruit2 = Factory.getInstance("reflect.Orange");
iFruit2.eat();
IFruit iFruit3 = Factory.getInstance("reflect.WaterMelon");
iFruit3.eat();
IFruit iFruit4 = Factory.getInstance("reflect.Appl");
iFruit4.eat();
}
}