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();
}
}
上面的代码可以根据客户端的输入来进行判断。
以上就是工厂设计模式。