工厂设计模式是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(); } }
当遇到某些题目让实现一个就简单的工厂设计模式时,上述代码足以应付。对于这个设计模式还需要见识更多问题,更多代码。