java的工厂模式

        工厂设计模式

大家先看下面的一个简单列子(此列子引出工厂设计模式)

package lianjeishujuku;

/**

 * 工厂设计模式简单应用

 * 接口简单的应用

 * */

public class start {

public static void main(String[]args) {

//现在要执吃苹果的方法

shuiguo    chi=new Apple();

chi.eat();

}

}

//有一个水果的方法

interface  shuiguo{//注意接口里面的方法都是虚方法   权限是public  默认是abstract  

public  void eat();

}

//下面定义一个苹果类    来继承于接口水果

class  Apple implements shuiguo{

@Override  /***这行代码是java中注解  这个单词是重写的意思    因为一个类实现一个接口要不这个接口里面的所有方法

都要写一遍*(注意:抽象类实现接口对于接口里面的方法抽象类可以实现也可以不实现)*/

public void eat() {

System.out.println("吃苹果........");

}

}

以上代码是没有任何语法错误,但是这个代码存在一个设计问题,什么设计问题呢?假如现在有这么一个需求,比如在增加一个水果类,

 package lianjeishujuku;

/**

 * 工厂设计模式简单应用

 * 接口简单的应用

 * */

public class start {

public static void main(String[]args) {

//现在要执吃苹果的方法

shuiguo    chi=new banana();//这个位置和上面那个代码不一样 这个是香蕉的 ,上面是苹果的

chi.eat();

}

}

//有一个水果的方法

interface  shuiguo{//注意接口里面的方法都是虚方法   权限是public  默认是abstract  

public  void eat();

}

//下面定义一个苹果类    来继承于接口水果

class  Apple implements shuiguo{

@Override  /***这行代码是java中注解  这个单词是重写的意思    因为一个类实现一个接口要不这个接口里面的所有方法

都要写一遍*(注意:抽象类实现接口对于接口里面的方法抽象类可以实现也可以不实现)*/

public void eat() {

System.out.println("吃苹果了........");

}

}

//现在增加一个吃香蕉的类

class banana implements shuiguo{

@Override

public void eat() {

System.out.println("吃香蕉了........");

}

}

从以上面代码中可以看出  增加一个水果类就要改变主函数里面的   这样是影响客户端的 ,有什么办法既能增加水果类由不用改变客户端的影响呢????看下面代码。

利用工厂设计模式

package lianjeishujuku;

/**

 * 工厂设计模式简单应用

 * 接口简单的应用

 * */

public class start {

public static void main(String[]args) {

//现在要执吃苹果的方法

shuiguo  f=hello.name(args[0]);//初始化参数

if (f!=null) {

f.eat();

}

}

}

//有一个水果的方法

interface  shuiguo{//注意接口里面的方法都是虚方法   权限是public  默认是abstract  

public  void eat();

}

//下面定义一个苹果类    来继承于接口水果

class  Apple implements shuiguo{

@Override  /***这行代码是java中注解  这个单词是重写的意思    因为一个类实现一个接口要不这个接口里面的所有方法

都要写一遍*(注意:抽象类实现接口对于接口里面的方法抽象类可以实现也可以不实现)*/

public void eat() {

System.out.println("吃苹果了........");

}

}

//现在增加一个吃香蕉的类

class banana implements shuiguo{

@Override

public void eat() {

System.out.println("吃香蕉了........");

}

}

class   hello{

public static shuiguo name(Stringclassname) {//直接去的接口实例

if ("apple".equals(classname)) {

return new Apple();

}else if("banana".equals(classname))

{

return new  banana();

}else {//如果都没有返回空

return null;

}

}

}


猜你喜欢

转载自blog.csdn.net/testdatas/article/details/77675190