1. 简单工厂
在接口和子类中,避免这两者之前的直接操作。加入工厂类,工厂类来负现生产出你需要的对象。
此以后的维护中,即便有新的子类继承了接口,但是你只需要关心工厂类把它生产出来即可。入口执行的代码可以不用变
这种简单的工厂在处理同一类产品的时候还是比较方便的 ,但是如果分类越细。则就不能这样使用了。比如苹果,我可以生产红富士也可以
生产将军等其化品种
package com.ryan;
interface Fruite {
public abstract void eat();
}
class Apple implements Fruite {
public void eat() {
System.out.println("吃苹果");
}
}
class Orange implements Fruite {
public void eat() {
System.out.println("吃橘子");
}
}
//造各种水果
class Factory {
public Fruite getFruite(String fruite) throws Exception {
if(fruite.equals("Apple")) {
return new Apple() ;
}else if(fruite.equals("Orange")) {
return new Orange();
}else {
throw new Exception("没有此类水果");
}
}
}
public class TestFactoryMode {
public static void main(String[] args) {
try {
new Factory().getFruite("Apple").eat();
new Factory().getFruite("Orange").eat();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述方法还有一个缺陷就是当接口有更多的子类来继承的时候
工厂类也需要跟着修改,如果使用反射则可以解决这样的问题
需要注意的是子类需要有无参的构造方法
package com.ryan;
interface Fruite {
public abstract void eat();
}
class Apple implements Fruite {
public void eat() {
System.out.println("吃苹果");
}
}
class Orange implements Fruite {
public void eat() {
System.out.println("吃橘子");
}
}
class Factory {
public Fruite getFruite(String className) throws Exception {
//使用反射后,只需要传入包.类名称当
//当子类有扩展后,此工厂类也不需要修改
Class<?> c = Class.forName(className);
Fruite instatnce = (Fruite)c.newInstance();
return instatnce;
}
}
public class TestFactoryMode {
public static void main(String[] args) {
try {
new Factory().getFruite("com.ryan.Apple").eat();
new Factory().getFruite("com.ryan.Orange").eat();
} catch (Exception e) {
e.printStackTrace();
}
}
}