工厂设计模式
大家先看下面的一个简单列子(此列子引出工厂设计模式)
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;
}
}
}