工厂模式java实现

接下来会使用java来实现工厂模式

传统工厂模式

如果是你自己写的接口,要想取得本接口的实例化对象,最好使用工厂类来设计。但我么也需要知道传统工厂所带来的问题

范例:传统工厂使用new

interface IFruit {
	public void eat();
}

class Apple implements IFruit {

	@Override
	public void eat() {
		System.out.println("[Apple] eat");
	}

}

class Factory {
	private Factory() {
	};

	public static IFruit getInstance(String classname) {
		if (classname.equals("Apple")) {
			return new Apple();
		}
		return null;
	}
}

public class FactoryModel {
	public static void main(String[] args) {
		IFruit fruit = Factory.getInstance("Apple");
		fruit.eat();
	}
}

这样就实现了一个简单的工厂类,通过使用new关键字来新建对象,但是这种方式在实际开发中但是我们基本不会用。一旦这个实现这个接口的对象增加,我们就需要不断的修改工厂类来适应新的类。比如增加了orange,我们就需要在Factory中添加一个判断,判断是否为Orange,一旦实现的类增加,这个工厂类将无比庞杂。

范例: 反射实现工厂类

class Factory {
	private Factory() {
	};

	public static IFruit getInstance(String classname) {
		IFruit fruit = null;
		try {
			fruit = (IFruit) Class.forName(classname).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fruit;
	}
}

public class FactoryModel {
	public static void main(String[] args) {
		IFruit fruit = Factory.getInstance("model.Apple");
		fruit.eat();
	}
}

这里修改了getInstance函数,通过使用反射,只需要传递类的完整的名字,就可以获取这个类的实例对象了。

这样解决了同一个接口的问题,但是一个项目中,可能有成千上万的接口,但是其实逻辑是差不多的,如果为此增加如此的代码量,显然是不可取的。所以我们考虑使用泛型。

添加泛型实现工厂类

class Factory {
	private Factory() {
	};

	public static <T> T getInstance(String classname) {
		T obj = null;
		try {
			obj = (T) Class.forName(classname).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return obj;
	}
}

public class FactoryModel {
	public static void main(String[] args) {
		IFruit fruit = Factory.getInstance("model.Apple");
		fruit.eat();
	}
}

这样,你只需要传入类的名字,就可以获取该类的对象了。

这里是我自己学习的总结,代码基本可以通过课堂查看,下面是阿里Java课堂

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值