[转]从代码学习设计模式 - 工厂模式


没有使用工厂模式时的代码:


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("**吃橘子**") ;  
            }  
    }  
public class FactoryDemo01{  
        public static void main(String args[]){  
                Fruit f = new Apple();  
                f.eat();  
            }  
    }  
/* 
E:\java>javac FactoryDemo01.java 
E:\java>java FactoryDemo01 
**吃苹果** 
*/ 

/*普通的代码编写方式*/
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("**吃橘子**") ;
   }
}
public class FactoryDemo01{
  public static void main(String args[]){
    Fruit f = new Apple();
    f.eat();
   }
}
/*
E:\java>javac FactoryDemo01.java

E:\java>java FactoryDemo01
**吃苹果**
*/

使用工厂模式的代码:
    工厂设计模式: 
    在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 Factory{  
        public static Fruit getFruit(String className){  
                Fruit f = null;  
                /*在这里使用【字符串常量的匿名对象.equals(className)】可以有效的避免出现空指向异常。*/ 
                if ("Apple".equals(className)){      
                        f = new Apple();  
                    }  
                if ("Orange".equals(className)){  
                        f = new Orange();  
                    }  
                return f;  
            }  
    }  
public class FactoryDemo02{  
        public static void main(String args[]){  
             /*直接使用工厂返回的对象。如果子类发生改变,就不再需要修改客户端。*/ 
                Fruit f = Factory.getFruit(args[0]);      
                if (f!=null)  
                f.eat();  
            }  
    }  
/* 
E:\java>javac FactoryDemo02.java 
E:\java>java FactoryDemo02 Apple 
**吃苹果** 
E:\java>java FactoryDemo02 Orange 
**吃橘子** 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值