常用工厂模式

工厂模式: 为创建对象提供接口

简单工厂模式:适用于逻辑简单项目
工厂方法模式:适用于中小型项目
抽象工厂模式:适用于逻辑复杂项目

工厂模式角色:
工厂角色:工厂类(全能类)
抽象的产品角色:产品的模版;在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;

    }


}

猜你喜欢

转载自blog.csdn.net/Smile_Sunny521/article/details/89539081