您的位置:首页 > 其它

【设计模式练习】工厂模式

2013-02-20 23:06 211 查看
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();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: