工厂设计模式

为什么要有工厂设计模式?
  • 解耦合
  • 一看见接口就立刻想到工厂模式
3.1、代码一
 简单工厂设计:
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 getInstance(String className){
  Fruit f = null ;
  if("apple".equals(className)){
   f = new Apple() ;
  }
  if("orange".equals(className)){
   f = new Orange() ;
  }
  return f ;
 }
};
public class FactoryDemo01{
 public static void main(String args[]){
  Fruit f = Factory.getInstance("apple") ;
  f.eat() ;
 }
};
 以上代码虽然完成了基本的工厂设计,但是发现如果现在接口增加了一个子类之后,需要修改工厂。
3.2、代码二
 以上代码如果增加了一个子类要修改工厂,那么下面使用Class类完成对象的实例化工作,使用之后,子类可以任意增加,而不用修改工厂类。
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 getInstance(String className){
  Fruit f = null ;
  try{
   f = (Fruit)Class.forName(className).newInstance() ;
  }catch(Exception e){}
  return f ;
 }
};
public class FactoryDemo02{
 public static void main(String args[]){
  Fruit f = Factory.getInstance("Apple") ;
  f.eat() ;
 }
};
3.3、代码三
 应该定义一个配置文件,配置文件之中定义了接口的全部子类,以后直接使用配置文件就可以知道可以使用那些子类。
 以后如果要增加子类的时候直接修改配置文件就可以增加子类了。
 Properties类:属性操作类。
import java.io.* ;
import java.util.* ;
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 Cherry implements Fruit{
 public void eat(){
  System.out.println("吃樱桃。。。") ;
 }
};
class Factory{
 public static Fruit getInstance(String className){
  Fruit f = null ;
  try{
   f = (Fruit)Class.forName(className).newInstance() ;
  }catch(Exception e){}
  return f ;
 }
};
class Init{
 public Properties init()  throws Exception{
  // 读取全部的属性
  Properties pro = new Properties() ;
  File f = new File("fruit.xml") ;
  if(f.exists()){
   // 直接读取
   pro.loadFromXML(new FileInputStream(f)) ;
  }else{
   // 设置若干个初始值
   pro.setProperty("a","Apple") ;
   pro.setProperty("o","Orange") ;
   // 把内容保存在文件之中
   pro.storeToXML(new FileOutputStream(f),"FRUIT") ;
  }
  return pro ;
 }
};
public class FactoryDemo03{
 public static void main(String args[]) throws Exception{
  Properties p = new Init().init() ;
  System.out.println(p) ;
  BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)) ;
  System.out.print("输入选择的类名称:") ;
  String str = buf.readLine() ;
  Fruit f = Factory.getInstance(p.getProperty(str)) ;
  f.eat() ;
 }
};
 某一个子类的增加并不会影响程序的运行,程序认的只是key,而具体的value可以任意更改。
 最早思路:以上的代码,达到配置文件与程序的相互分离。
 现在思路:配置文件只接写在程序中:ANNOTION。EJB 3.0
4、总结
 只要是看见了接口,就要考虑工厂,有了工厂,就要考虑扩充子类的情况,扩充了子类就需要考虑到底如何知道所有的子类的完整的包.类名称。
 永远记住:最好的程序设计就是:程序只认key,而具体的value可以任意的更改。
代理设计模式、工厂设计模式是使用最多的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值