工厂设计模式是java开发中使用最多的设计模式。
观察下面的代码,思考有什么问题:
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 Banana implements Fruit {
public void eat() {
System.out.println("吃香蕉。");
}
}
public class test {
public staitc void main(String args[]) {
Fruit f = new Apple(); //实例化接口的子类为接口实例化
f.eat();
}
}
本程序通过实例化接口的子类为接口实例化,但是这种操作有一些问题。我们把主类、主方法看作客户端,客户端操作应该为用户提供便利。但是上段代码中,接口实例化了一个固定的类。当我要使用香蕉类中的eat()方法时,要对客户端中的代码进行较大改动。代码将 Fruit-->Apple 强行绑定在一起。代码耦合度有点高。
我们寻求一种更好的方法解决这种问题。 于是有了工厂设计模式即Fruit-->factory-->Apple,这样当水果变化时,通过工厂发生相应的改变,Fruit可以不变。降低了程序的耦合性,实现了代码的可移植性。修改后的代码如下:
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 Banana implements Fruit {
public void eat() {
System.out.println("吃香蕉。");
}
}
class Factory {
public staitc Fruit getInstance(String className) {
if(Apple.equals("className")){
return new Apple();
}
if(Apple.equals("className")){
return new Orange();
}
if(Apple.equals("className")){
return new Banana();
}
return null;
}
}
public class test2 {
public static void main(String[] args) {
Fruit f = Factory.getInstance("Apple");//通过工厂产生APPLE类,当修改水果时只需要修改getInstance()方法中的参数。
f.eat();
}
}
当遇到某些题目让实现一个就简单的工厂设计模式时,上述代码足以应付。对于这个设计模式还需要见识更多问题,更多代码。