`
isiqi
  • 浏览: 16032754 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

简单工厂 模式

阅读更多

功能:

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

实例:

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("造不了这种类型的车");
}
}

}

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics