`
daxiaoli123
  • 浏览: 45567 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

蝴蝶容器(动态容器)

阅读更多
我要得到一个对象
有三种方式:new,反射,引用

1.我们通过一个一个工厂来得到一个对象。
定义一个类,实例的统一管理。就是说将创建对象的过程全部封装到这个工厂类里面来了
  减少了new关键字 所以减少了对象与对象之间的耦合度。

  缺点:当产品修改时,工厂类也要发生相应的改变。这样改动的代码也比较的麻烦。

2.然后我们使用了蝴蝶容器。
   首先说一个容器他可以管理对象的生命周期,可以通过配置文件来生成对象。这样就非常的方便和具有很强的扩展性,他也比较的灵活和具有稳定的维护性能。
    自定义一个蝴蝶容器:
    * 我写过蝴蝶容器,所以比起其他的选择来我更了解它。 Butterfly容器的类JAVA配置式语言在读,写和理解方面比Springs XML配置更简单。
    * Butterfly容器的配置式语言比Pico和Guice的Java API更直接易懂。

   使用:Container container = new Container();
ScriptFactoryBuilder builder = ScriptFactoryBuilder(container);
得到对象方法1:
builder.addFactory("myBean = * com.jenkov.SomeClass(); ");
SomeClass anInstance = (SomeClass) container.instance("myBean");

得到对象方法2:
FileInputStream input = new FileInputStream("myContainerConfig.txt");//从文件里去读取键值对
builder.addFactories(input);
OtherClass anInstance = (OtherClass) container.instance("myBean2");

myContainerConfig.txt
someBean = * com.jenkov.SomeClass();
myBean   = * com.jenkov.OtherClass($0);
myBean2  = * myBean(someBean);
myBean3  = * myBean(com.jenkov.SomeClass());
首先,someBean工厂被定义成SomeClass的一个简单实例。这时,myBean被定义成一个可重用的工厂,初始化OtherClass, 并且传了任何需要传递给它的参数到OtherClass构造器里。参数用一个$和从0开始的数字标记(这里是$0)。myBean2带着一个 someBean工厂的产品当做myBean工厂被定义了。myBean3被定义成调用带有一个SomeClass实例的myBean工厂,那个实例是直接在myBean3工厂里创建的。

得到对象方法3:
这是一个显示一个工厂如何被继承的例子。工厂扩展是重用工厂的另一个方法。
bean  = * com.jenkov.SomeClass().setValue("value");
bean2 = * bean.setValue("value2");
bean3 = * bean.setValue("value3");
首先,定义一个叫做bean的工厂。这个工厂将创建一个SomeClass的实例,然后调用带有参数值“value”的setValue()方法。如果你想的话你可以注入另一个bean的产品到setValue()方法。其次,定义一个叫做bean2的工厂。它被定义来调用bean工厂,然后调用带有参数值“value2”的setValue()方法.这个实际上重写了bean工厂里的值设置。最后的工厂,bean3, 和bean2几乎一样,除了传给setValue()方法的参数值。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics