java 反射工厂

工厂方法模式定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

UML类图:

所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。

1.      Creator所有子类都必须实现这个抽象的factoryMethod()方法。

2.      ConcreteCreator实现了factoryMethod(),以实际制造出产品。由它负责创建一个或多个集体产品,只有此类知道如何创建这些产品。

3.      所有产品ConcreteProduct必须实现Product,这样就可以使用这个接口,而不是具体的类。

注意:这里说的实现不一定是实现接口,而是泛指超类。

所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。这样做的好处是在实例化对象时,只会依赖于接口,而不是具体的类。(设计原则:针对接口编程)

 

例如:有一个蛋糕工厂,由蛋糕工厂负责生产各种蛋糕(奶油蛋糕、巧克力蛋糕、水果蛋糕、冰欺凌蛋糕等等)

//蛋糕类

public abstract class Cake {
protected String name;//名字

public void make() {
System.out.println("做蛋糕---");
}

public String makeDone() {
return name;
}

}


//巧克力蛋糕

public class ChocolateCake extends Cake {

public ChocolateCake() {

name = "巧克力蛋糕";

}

}


//奶油蛋糕

public class MilkCake extends Cake{

public MilkCake() {
name = "巧奶油蛋糕";
}

}


//工厂

public abstract class Factory {

//1.工厂方法是抽象的。
//2.工厂方法必须返回一个产品。
//3.工厂方法将客户(超类中的代码,例如:toMake())和具体创建产品的代码分隔开来。
abstract Cake createCake(String item);

public Cake toMake(String type){

Cake cake = createCake(type);
return cake;

}

}


//蛋糕工厂   利用java反射机制

public class CakeFactory extends Factory{

	@Override
	Cake createCake(String ClassName) {

		Cake c = null;
		try {
			c=(Cake)Class.forName(ClassName).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 ClientTest {

    public static void main(String[] args) {
	   
      
       //首先先创建一个蛋糕工厂
       Factory factory = new CakeFactory();
       //由蛋糕店工厂负责生产客户所需要的蛋糕。
       Cake cake = factory.toMake("com.csdn.reflectfactory.MilkCake");
       Cake cake_ = factory.toMake("com.csdn.reflectfactory.ChocolateCake");
       //取出工厂创建的蛋糕
       System.out.println(cake.makeDone());
       System.out.println(cake_.makeDone());
	}

}


输出:奶油蛋糕

          巧克力蛋糕

反射的好处是如果创建新种类的蛋糕不用修改工厂的代码。

可以看看 没用反射的工厂模式 http://blog.csdn.net/allen_gang/article/details/9033453

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值