设计模式--工厂设计(2)


寄语:学习知识从发现问题开始!

发现问题:观察一下程序
package com.zsc.everyday;

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

相信大家很容易就可以看懂。这样的方式好不好?我们再来看看下面的代码:
package com.zsc.everyday;

interface Fruit{
	public void eat();
}
class Apple implements Fruit{
	public void eat() {
		System.out.println("吃苹果");
	}
}
class Orange implements Fruit{
	public void eat() {
		System.out.println("吃橘子");
	}
}
class Factory{
	public static Fruit getIntence(String className){
		Fruit f = null ;
		if("apple".equals(className)){
			f = new Apple();
		}
		if("orange".equals(className)){
			f = new Orange();
		}
		return f ;
	}
}
public class InterfaceCase01 {
	public static void main(String[] args) {
		Fruit f = null ;
		f = Factory.getIntence("apple");
		f.eat();
	}
}

这样看起来似乎就好一点了。

解决问题:其实这种开发模式叫做工厂模式。我么可以很快发现程序在接口和子类之间加入了一个过渡段,通过此过渡段取得接口的实例化对象。

总结:
其实上面两个程序运行的结果没什么区别,但是取得实例的过程却不大一样,因为接口对象的实例是通过工厂取得的,这样以后如果再有子类扩充,直接修改客户端就可以根据标记得到相应的实例,灵活性较高。



补充:大家可能会发现 这段代码

if("apple".equals(className)){
	f = new Apple();
}
为什么不写成

if(className.equals("apple")){
	f = new Apple();
}
其实这两段代码本身也没有任何问题。但是如果传入参数的值为 null 。那么第二段代码将会出错。

package com.zsc.everyday;
public class EqualsTest {
	public static void main(String[] args) {
		String str = null ;
		System.out.println(str.equals("zhangsan"));
	}
}

Exception in thread "main" java.lang.NullPointerException
at com.zsc.everyday.EqualsTest.main(EqualsTest.java:6)

可是下面的代码:

package com.zsc.everyday;
public class EqualsTest {
	public static void main(String[] args) {
		String str = null ;
		System.out.println("zhangsan".equals(str));
	}
}

false

上面的虽也是小事,也希望大家在开发的时候能够注意到!共勉1




你可能感兴趣的:(设计模式,apple,exception,String,null,Class)