依赖注入与工厂模式Demo

摘自百度: 

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI

 

早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了。基于这个结论,他为创造了控制反转一个更好的名字:依赖注入。许多非凡的应用(比HelloWorld.java更加优美,更加复杂)都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要,与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么如你所见,这将导致代码高度耦合并且难以测试。
  IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle")。差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可说是IoC原理的一项应用。SmallTalk,C++, Java 或各种.NET 语言等面向对象程序语言的程序员已使用了这些原理。
 

  控制反转是Spring框架的核心。 

  应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
  当前比较知名的IOC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。
  在上面的几个IOC容器中,轻量级的有Pico Container、Avalon、Spring、HiveMind等,超重量级的有EJB,而半轻半重的有容器有JBoss,Jdon等。
  可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
  IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。反射的应用是很广泛的,象Hibernate、Spring中都是用“反射”做为最基本的技术手段。

  在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普通应用开来的原因。但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。 

IoC 的类型

  现有的框架实际上使用以下三种基本技术的框架执行服务和部件间的绑定:
  类型1 (基于接口): 可服务的对象需要实现一个专门的接口,该接口提供了一个对象,可以从用这个对象查找依赖(其它服务)。早期的容器Excalibur使用这种模式。
  类型2 (基于setter): 通过JavaBean的属性(setter方法)为可服务对象指定服务。HiveMind和Spring采用这种方式。
  类型3 (基于构造函数): 通过构造函数的参数为可服务对象指定服务。PicoContainer只使用这种方式。HiveMind和Spring也使用这种方式。

 

 以上信息来源于百度

自己做了一个简单的demo,加深印象 ,实例:人可以用武器杀死动物,不同的武器对动物的伤害不同

人类: 

 代码

杀接口

interface  I杀
    {
        
void  kill(I可以被杀 lw);
    }

 

 

可以被杀的对象接口

interface I可以被杀

    {
         void  掉血( int  hp);
    }

 

 猎物:代码

 

 

 武器工厂代码

 

石头class 石头:I杀

    {

         public   void  kill(I可以被杀 lw)
        {
            lw.掉血(
100 );

        }
    }

 

主程序代码

 

 

 

转载于:https://www.cnblogs.com/dlz1123/archive/2011/02/18/1957988.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 iOS 开发中,依赖注入(Dependency Injection)是一种常用的设计模式,它可以帮助我们解耦代码,提高可测试性和可维护性。下面是一个简单的依赖注入的示例: 首先,我们可以创建一个协议来定义我们所需要的依赖项,比如一个网络服务: ```swift protocol NetworkService { func fetchUser(completion: @escaping (User?, Error?) -> Void) } ``` 然后,我们可以实现这个协议: ```swift class NetworkServiceImpl: NetworkService { func fetchUser(completion: @escaping (User?, Error?) -> Void) { // 实现网络请求逻辑 } } ``` 接下来,我们可以创建一个需要依赖网络服务的类: ```swift class UserManager { let networkService: NetworkService init(networkService: NetworkService) { self.networkService = networkService } func fetchCurrentUser() { networkService.fetchUser { (user, error) in // 处理获取到的用户数据 } } } ``` 在使用的地方,我们需要创建一个具体的网络服务实例,并将其传递给 `UserManager` 类的构造方法: ```swift let networkService = NetworkServiceImpl() let userManager = UserManager(networkService: networkService) userManager.fetchCurrentUser() ``` 这样,我们就实现了依赖注入。通过将依赖项作为参数传递给类的构造方法,我们可以灵活地替换或模拟依赖项,方便进行单元测试和代码维护。 当然,这只是一个简单的示例,实际使用中可能会涉及更复杂的依赖关系和依赖注入框架。但基本的原理和思想是相通的。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值