复习整理的DAY19_简单工厂模式

该博客介绍了简单工厂模式的概念,展示了如何创建一个简单的工厂类用于根据传入的类型创建不同运算类的实例。此外,还通过反射技术改进了工厂方法,实现了从配置文件动态加载类并创建对象。这使得客户端与具体实现解耦,提高了代码的灵活性。
摘要由CSDN通过智能技术生成

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

上示例:

public class Cal {
    int num1;
    int num2;

    public Cal() {
    }

    public Cal(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public int getResult() {
        return -1;
    }
}
public class CalFactory {
    public static Cal createCal(int calType) {
        Cal cal = null;
        switch (calType) {
            case 1 : // +
                cal = new Add(3, 4);
                break;
            case 2:
                cal = new Sub(3, 4);
                break;
            case 3:
                cal = new Mul(3, 4);
                break;
            case 4:
                cal = new Div(3, 4);
                break;
        }
        return cal;
    }

}
public class Add extends Cal{
    public Add() {
    }

    public Add(int num1, int num2) {
        super(num1, num2);
    }

    public int getResult() {
        return num1 + num2;
    }
}
public class Sub extends Cal{
    public Sub() {
    }

    public Sub(int num1, int num2) {
        super(num1, num2);
    }

    public int getResult() {
        return num1 - num2;
    }
}
public class Mul extends Cal{
    public Mul() {
    }

    public Mul(int num1, int num2) {
        super(num1, num2);
    }

    public int getResult() {
        return num1 * num2;
    }
}
public class Div extends Cal{
    public Div() {
    }

    public Div(int num1, int num2) {
        super(num1, num2);
    }

    public int getResult() {
        return num1 / num2;
    }
}
public class Demo {

    @Test
    public void testFactory() {
        Cal cal = CalFactory.createCal(1);
        cal.num1 = 3;
        cal.num2 = 5;
        int result = cal.getResult();
        System.out.println(result);// 8
    }
}

 

客户端直接使用的是接口,客户端不会和实现发生直接联系,客户端就被接口和实现隔离开来。

 简单工厂命名建议:模块名+Factory

而方法名通常命名为:get接口名或是create接口名

简单工厂的核心是选择,不是实现

可以用反射加以改进:

配置文件:

在包reflect里面创建一个db.properties

 接口

public interface IDB {
    void getConnection();
}

接口实现 

public class MySql implements IDB{
    @Override
    public void getConnection() {
        System.out.println("MySql.getConnection");
    }
}

工厂

public class DBFactory {

    public static IDB createDB() throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        FileInputStream fileInputStream = new FileInputStream("src/reflect/db.properties");
        Properties properties = new Properties();
        properties.load(fileInputStream);// 加载配置文件
        // 获得文件里面className的内容
        String classname = properties.getProperty("className");
        System.out.println(classname);// 打印内容
        Class clazz = Class.forName(classname);// 通过反射获得字节码文件
        IDB db = (IDB) clazz.newInstance();// 通过反射获得类对象
        return db;
    }
}
public class DBDemo {

    @Test
    public void test() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
        IDB db = DBFactory.createDB();
        db.getConnection();// 调用对象方法
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值