工厂模式: 为创建对象提供接口
简单工厂模式:适用于逻辑简单项目
工厂方法模式:适用于中小型项目
抽象工厂模式:适用于逻辑复杂项目
工厂模式角色:
工厂角色:工厂类(全能类)
抽象的产品角色:产品的模版;在java中用接口表示
具体的产品角色:生产的产品;在java中用对象表示
优点:
由工厂控制产品对象的创建
客户端代码可与任一子类协同工作,而无需知道该子类的名称与实现细节
缺点:
为了创建新的产品类型,需要创建工厂接口的子类型,编码较多
例如:汽车销售商场
该模式将创建对象的过程放在了一个静态方法中来实现.在实际编程中,如果需要大量的创建对象,该模式是比较理想的.
ep:工厂+反射。
package cn.itcast.factory;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import cn.itcast.reflect.Person;
/*
工厂设计模式就是用于产生对象 的。
*/
class Car{}
class BMW extends Car{}
class BSJ extends Car{}
public class Demo1 {
public static void main(String[] args) throws Exception {
Person p = (Person) getInstance();
System.out.println(p);
}
//需求: 编写一个工厂方法根据配置文件返回对应的对象。
public static Object getInstance() throws Exception{
//读取配置文件
BufferedReader bufferedReader = new BufferedReader(new FileReader("info.txt"));
//读取第一行 : 读取类文件的信息
String className = bufferedReader.readLine();
//通过完整类名获取对应 的Class对象
Class clazz = Class.forName(className);
//获取到对应的构造方法
Constructor constructor = clazz.getDeclaredConstructor(null);
constructor.setAccessible(true);
Object o = constructor.newInstance(null);
//给对象设置对应的属性值
String line = null;
while((line = bufferedReader.readLine())!=null){
String[] datas = line.split("=");
Field field =clazz.getDeclaredField(datas[0]);
//设置可以访问
field.setAccessible(true);
if(field.getType()==int.class){
field.set(o, Integer.parseInt(datas[1]));
}else{
field.set(o, datas[1]);
}
}
return o;
}
}