深入浅出设计模式教程 - 极悦
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 深入浅出设计模式教程

深入浅出设计模式教程

更新时间:2022-05-19 09:47:24 来源:极悦 浏览803次

设计模式是为重复性和典型项目问题提供解决方案的现成描述。

它们是经验、辛勤工作和大量试验和错误的结果。它们还代表了面向对象编程的深思熟虑和最佳实践(SOLID、DRY、KISS和YAGNI)。这些模式成为程序员之间交流的一个元素,它们是每个工程师入门的一个元素。

一般来说,设计模式只不过是重复问题的演练,值得写下来和理解。值得注意的是,设计模式并不建议直接实现解决方案,而只是一个结构的轮廓,其中包含一些应该适应我们需求的特征方面。

想象一下,一位程序员同事试图向您解释小部件和通过 SOAP 通信的类之间的流是如何工作的。

值得注意的是,设计模式并没有同质的划分,而且通常与该主题的研究一样多。

创造模式

结构图案

行为模式

每种设计模式都适用于确定的情况。在不恰当的情况下使用它们可能弊大于利!

在本文中,我们将限制自己选择的模式。

创作模式

创建模式与创建对象的控制机制相关联。形成对象的基本模式在某些项目中可能存在问题,并可能导致某些领域不必要的复杂性。创建模式应该防止出现问题并引入对创建对象的更多控制。他们的任务是将对象的创建、完成和表示过程分开。

有五种众所周知的设计模式可以在广泛的编程语言中实现:

抽象工厂模式

建造者模式

工厂方法模式

原型模式

单例模式

在本文中,我们将仔细研究工厂方法和单例方法。

单例模式

单例模式最多提供给定类的一个实例和对其引用的全局访问。由于它违反了两个 SOLID 规则(单一责任原则和开放/封闭原则),因此经常被呈现为反模式,有时它被过度使用并且经常被视为全局变量的对象替代品。在多线程环境中实现时也碰巧有问题。

如果您的应用程序需要对同一资源进行全局访问,请使用此模式。

您可以在下面找到 CiviCRM 3.4 中单例的示例性实现:

_session = & $ _SESSION ;
        $这个->创建();
    } 
    静态函数&单例()  
    {
        if ( self :: $ _singleton === null ) {    
            自我:: $ _singleton =新CRM_Core_Session ; 
        }
        返回自我:: $ _singleton ; 
    }
// 其他方法
}

工厂方法模式

工厂方法模式是最著名的设计模式之一。

它的任务是向客户端隐藏创建对象的细节,同时提供生成它们的接口。实现接口的类决定创建对象的类。

客户端期望接口或抽象类的安全实现,但对特定实现不感兴趣。然而,程序员可以很容易地用额外的对象类扩展工厂的产品组合。

在设计您的应用程序时,值得考虑的是应用程序是否真的需要目标工厂。如果一个产品有许多具有相似基类的类,并且您在接口或抽象类中操作对象,那么工厂方法模式肯定会很有用。

抽象工厂模式

抽象工厂模式更进一步,向更高层次的抽象移动(因此得名)。在这种情况下,客户不知道使用什么样的工厂。抽象工厂提供了一个用于创建客户端使用的依赖对象组的接口,但没有给出它们的确切实现。

对于用户自定义接口可用的特定产品的创建,通常使用基于工厂方法模式或原型模式的工厂(这里不讨论)。

工厂方法模式和抽象工厂模式之间的主要区别在于,在前者中,客户收到一个产品,而在后者中,客户收到整个产品组。

下图将有助于理解抽象工厂的概念:

/ **
抽象的第一类实现
* /
抽象类AbstProduct1 {  
	公共抽象无效动作();  
} 
类Product1A扩展AbstProduct1 {   
	Product1A (字符串参数){
		系统。出来。println ( "我" + arg );
	}
	公共无效动作(){ };   
}
类Product1B扩展AbstProduct1 {   
	ProductA2 (字符串参数){
		系统。出来。println ( "我" + arg );
	} 
	公共无效动作(){ };   
}
/ **
抽象的二等实现
* /
抽象类AbstProduct2 {  
} 
类Product2A扩展AbstProduct2 {   
	Product2A (字符串参数){
		系统。出来。println ( "我" + arg );
	} 
} 
类Product2B扩展AbstProduct2 {   
	ProductB2 (字符串参数){
		系统。出来。println ( "我" + arg );
	}
} 
/ **
抽象工厂实现
* /
抽象类AbstractFactory {  
	抽象AbstProduct1 createProduct1 (); 
	抽象AbstProduct2 createProduct2 (); 
} 
类FactoryA扩展AbstractFactory {   
	AbstProduct1 createProduct1 () {
		返回新的Product1A (“Product1A” );  
	}
	AbstProduct2 createProduct2 () {
		返回新的Product2A (“Product2A” );  
	}
}
类FactoryB扩展AbstractFactory {   
	AbstProduct1 createProduct1 () {
		返回新的Product1B ( "Product1B" );  
	}
	AbstProduct2 createProduct2 () {
		返回新的Product2B (“Product2B” );  
	}
} 
// 一些工厂操作
类FactoryMaker { 
	私有静态AbstractFactory pf = null ;  
	静态AbstractFactory getFactory (字符串选择){ 
		如果(选择。等于(“a” )){
			pf =新工厂A (); 
		} else if (选择.等于( "b" )) { 
				pf =新工厂 B (); 
			}返回pf ; 
	}
} 
// 客户端
公共类ClientApp {  
	公共静态无效主要(字符串参数[]){  
		AbstractFactory pf = FactoryMaker 。获取工厂(“一” );
		AbstractProductA产品= pf 。创建产品1 ();
	}
}

行为模式

行为模式的任务是为与对象间通信相关的解决方案引入灵活性。它们专注于在通信对象之间分配特定的角色和职责。

这种模式是:

模式迭代器

观察者模式

命令模式

策略模式

模板方法模式

结构图案

这些模式最重要的特点是通过找到一种简单的方法来实现实体之间的依赖关系,从而方便操作和设计应用程序。由于这种模式,设计包含独立类库的应用程序更容易。

以下结构模式是最著名的结构模式之一:

模式适配器

装饰图案

立面图案

代理模式

复合图案

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>