java学习之路之接口(3)--工厂设计模式

java学习之路之接口(3)
-----工厂设计模式
首先观察一段程序代码:

interface Fruit{
	public void eat();
}
class Apple implements Fruit{
	public void eat(){
		System.out.println("吃苹果");
	}
}
public class Demo1 {
	public static void main(String[] args) {
		Fruit f = new Apple();
		f.eat();
	}

}

结果:  吃苹果

分析: 
如果要想确认一个代码是否真的好,标准如下:
· 客户端调用简单,不关注具体的细节。
· 客户端之外的代码修改不影响用户的使用,即:用户不用关心代码的实现。

以上的程序没有语法错误,但是关键字new 有问题。一个借口不可能只有一个子类,所以对于Fruit也可能产生多个子类对象。假如需要一个新的类:吃橘子。 那么就需要修改代码 new Apple -> new Orange 。每一次修改对象都需要修改代码,这样做法明显不好。
在整个代码过程之中,我们最需要关心的就是如何取得一个Fruit接口对象,而对于对象是如何被实例化的,不是客户端的工作。
所以最大的问题就在关键字new ,这一问题就可以理解为 耦合度太高 问题就是代码不方便维护,就相当于A要与B绑定在一起。可以完全参考Java虚拟机的设计:
程序--> JVM --> 适应不同的操作系统 即(A-->C-->B)

范例: 增加一个过渡。

interface Fruit{
	public void eat();
}
//增加工厂类
class Factory{
	public static Fruit getInterface (String className){
		if("Apple" .equals(className)) //使用static方法是因为该类中不使用属性
			return new Apple();
		else if("Orange".equals(className))
			return new Orange();
		else
			return null;
	}
}
//-----over
class Apple implements Fruit{
	public void eat(){
		System.out.println("吃苹果");
	}
}
class Orange implements Fruit{
	public void eat(){
		System.out.println("吃橘子");
	}
}
public class Demo1 {
	public static void main(String[] args) {
		Fruit f1 = Factory.getInterface("Apple"); //客户端输入
		f1.eat();
		Fruit f2 = Factory.getInterface("Orange");
		f2.eat();
	}
}

现在的客户端不会看见具体的子类,因为所以的接口对象都是通过工厂类取得的,如果日后需要增加对象,则只需要修改工厂类,但是客户端的调用不会改变。
此时main方法可以继续优化:
public class Demo1 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String s = in.next();
		Fruit f = Factory.getInterface(s); //客户端输入
		f.eat();
	}
}

上面的代码可以根据客户端的输入来进行判断。
以上就是工厂设计模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值