简单的反射实现工厂模式

//第一步:声明一个接口,用于其它类实现
public interface Fruit {
	 public void eat();
}
//第二步:声明你需要的类,该类去实现上接口,这里我就声明了两个
public class Apple implements Fruit{
    @override
    public void eat(){
        System.out.println("苹果已经造出");
    }
}
public class Orange implements Fruit{
    @override
    public void eat(){
        System.out.println("橙子已经造出");
    }
}
//第三步:声明你需要的工具工厂类
public class Factory() throws Exception{
    //(接口新增了子类)这样就可以不用写new来实例化对象,解决代码耦合
    public static Fruit getFruit(String className){
        Class<?> cl =	Class.forName(className);    
        Fruit fruit = (Fruit)cl.newInstance();
        return fruit;
    }
}
//第四步:写出你需要的TetsDemo
public class TestFactory{
    public static void main(String args) throws Exception{
        	Class<?> cl = Class.forName("study0915.Factory");
			Factory factory = (Factory) cl.newInstance();//实例化对象,会调用无参构造
			Fruit fruit = factory.test("study0915.Apple");
			fruit.eat();//苹果已经造出,
        //或者调用Method method = 类.getDeclaredMethod(方法名,参数:没有就不写);
        //method.invoke(实例化对象,方法形参:比如String.class)
    }
}

//引申:在实际开发中,如果将以上的工厂模式再结合一些配置文件(例如xml格式的文件),就可以通过修改xml配置文件动态定义项目中的所需的操作类,像一些主流框架都用得到。

顺便贴上:类的控制访问权限(不写修饰符修饰类,表示默认dafault,只能同包或者同类访问)

public:表示其后的元素对任何人都可以使用。
protected:与private相当,差别在于继承的类可以访问protected修饰的元素,同包中的其他类元素也可以访问。 
default:在不指定任何关键字的情况下,这种权限将发挥作用,它是一种包的访问权限,即在当前包中的任何元素可以访问。
private:表示其后的元素除了类型的创建者和内部的方法之外任何人都不能访问。 

修饰符

访问权限控制的作用

1、让客户端程序员无法触及他们不应该触及的一部分数据——这些数据对于数据类型的内部操作是必须的,但并不是解决特定问题所需接口的一部分。隐藏一些实现的细节对于保护数据类型内部脆弱的部分,提高程序的安全性和可用性也是必须的。

2、允许类库的设计者改变其内部的工作方式而不影响客户端程序员。在设计者有更加优化的代码设计方式的时候可以随时改变类的内部结构,而这些对于客户端程序员都是不可见的,他们也无需关心类的实现细节。

猜你喜欢

转载自blog.csdn.net/qq_40826106/article/details/82712693