简单工厂 模式

来源:互联网 发布:漫画制作软件手机版 编辑:程序博客网 时间:2024/05/22 05:40

功能:

  简单工厂模式又称静态工厂模式,用来实例化目标类的静态类。

 

实例:

a、说明:

1、(接口)汽车Car里有
2个抽象方法
开车
停车
2、造一个奔驰Benz
1)实现Car接口
2)覆盖car的抽象方法
开车
停车
3、再造一个伏特车Ford
同样实现car接口和覆盖接口的方法
4、实例化对象
5、弊端
/******************************/
//调用奔驰
Car benz = new Benz();
benz.run();
//调用伏特
Car ford = new Ford();
ford.run();
/******************************/
都要使用Car
不论奔驰和伏特都与Car紧密耦合了????
6、中间加一个工厂类
专门为客户端实例化一个对象
/******************************/
//加一个工厂类,为客户端实例化一个对象
class Factory{
//
public static Car getCarInstance(){
//return new Benz();
//实例化伏特
return new Ford();
}
}
/******************************/
7main方法既要实例化奔驰,又要实例化伏特
修改静态工厂的方法,给它添加参数
8、如果用户希望工厂能创造用户想要的汽车,输入参数在工厂中没有
则要增加一个对实例对象的判断;
空指针
9、如果又扩充子类而不用去修改工厂的办法
java的反射机制替换if判断
Class.forName("designPatterns.factorydemo3."+type).newInstance()
然后强制转化为Car
Car c=null;
try {
c = (Car)Class.forName("designPatterns.factorydemo3."+type).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return c;

 b、代码1

*******************************************************

package designPatterns.factorydemo.simplefactory;


//车类型
interface Car{
  public void run();;
  public void stop();;
}

//第一种车
class Benz implements Car{
 public void run(){
  System.out.println("奔驰开动了!");  
 }
 
 public void stop(){
  System.out.println("奔驰停了!"); 
 }
}


//第二种车
class Ford implements Car{
 public void run(){
  System.out.println("伏特开动了!"); 
 }
 
 public void stop(){
  System.out.println("伏特停了!"); 
 }
}


//加一个工厂类,为客户端实例化一个对象
class Factory{
 //
 public static Car getCarInstance(){
  
  //return new Benz();
  //实例化伏特
  return new Ford();
 }
}

public class SimpleFactorydemo {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
/**
 * 没有使用工厂模式时,即没有添加工厂类Factory时*/
  //错误的
//  Benz benz = new Benz();
//  benz.run();
  //调用奔驰
//  Car benz = new Benz();
//  benz.run();
//  //调用伏特
//  Car ford = new Ford();
//  ford.run();
//  
  /**
   * 添加了Factory类后*/
  Car benz = Factory.getCarInstance();
  benz.run();
  benz.stop();
  //客户端不能选择
  
 }

}

********************************************************

c、代码2: 

如果用户希望工厂能创造用户想要的汽车,输入参数在工厂中没有

则要增加一个对实例对象的判断;

*******************************************************

package designPatterns.factorydemo2;

//车类型
interface Car{
  public void run();;
  public void stop();;
}

//第一种车
class Benz implements Car{
 public void run(){
  System.out.println("奔驰开动了!");  
 }
 
 public void stop(){
  System.out.println("奔驰停了!"); 
 }
}


//第二种车
class Ford implements Car{
 public void run(){
  System.out.println("伏特开动了!"); 
 }
 
 public void stop(){
  System.out.println("伏特停了!"); 
 }
}


//加一个工厂类,为客户端实例化一个对象
class Factory{
 //
 public static Car getCarInstance(String type){
  
  //return new Benz();
  //实例化伏特
  //return new Ford();
  Car c=null;
  if(type.endsWith("Benz"))
   c= new Benz();
  else if(type.endsWith("Ford"))
  c= new Ford();
  return c;
  
 }
}

public class SimpleFactorydemo2 {

 /**
  * @param args
  */
 

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  Car benz = Factory.getCarInstance("Benz");
  benz.run();
  benz.stop();
  
   Car ford = Factory.getCarInstance("Ford");
   ford.run();
   ford.stop();
  
   //如果创建一个自己的车,则要判断工厂里面是否有
   Car me = Factory.getCarInstance("adfjakljf");
   if(me!=null)
   {
   me.run();
   me.stop();
   }
   else{
    System.out.println("造不了这种类型的车");
   }
  
  
  
  
 }

}

*******************************************************

e、代码3:利用java的反射机制来 解决扩充子类不去修改工厂

********************************************************

package designPatterns.factorydemo3;

 


//车类型
interface Car{
  public void run();;
  public void stop();;
}

//第一种车
class Benz implements Car{
 public void run(){
  System.out.println("奔驰开动了!");  
 }
 
 public void stop(){
  System.out.println("奔驰停了!"); 
 }
}


//第二种车
class Ford implements Car{
 public void run(){
  System.out.println("伏特开动了!"); 
 }
 
 public void stop(){
  System.out.println("伏特停了!"); 
 }
}

//扩充的车
class Toyoto implements Car{
  public void run(){
   System.out.println("丰田开动了!"); 
  }
  
  public void stop(){
   System.out.println("丰田停了!"); 
  }
}


//加一个工厂类,为客户端实例化一个对象
class Factory{
 //
 public static Car getCarInstance(String type){
  
  //return new Benz();
  //实例化伏特
  //return new Ford();
//  Car c=null;
//  if(type.endsWith("Benz"))
//   c= new Benz();
//  else if(type.endsWith("Ford"))
//  c= new Ford();
//  return c;
  Car c=null;
  try {
   c = (Car)Class.forName("designPatterns.factorydemo3."+type).newInstance();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return c;
  
  
 }
}
public class SimpleFatorydemo3 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
//  如果创建一个自己的车,则要判断工厂里面是否有
   Car me = Factory.getCarInstance("Toyoto");
   if(me!=null)
   {
   me.run();
   me.stop();
   }
   else{
    System.out.println("造不了这种类型的车");
   }
 }

}

 

*******************************************************

 

原创粉丝点击