如何理解这6种常见设计模式?
简介:设计模式能够帮助我们优化代码结构,让代码更优雅灵活。有哪些常见的设计模式?如何合理运⽤?本⽂分享作者对⼯⼚模式、单例模式、装饰模式、策略模式、代理模式和观察者模式的理解,介绍每种模式的模式结构、优缺点、适⽤场景、注意实现及代码实现。
⼀前⾔
最近在改造⼀些历史的代码,发现⼀个很明显的特点,⼤部分代码是记叙⽂,按照事件的发展过程将故事平铺直叙的讲解出来。
这种⽅式的好处是⽐较符合⼈类的思维习惯,⼀条主线讲到底,代码阅读起来没有太⼤难度,只要顺着藤就能摸到⽠,但是缺点也很明显,⼀旦故事线中需要插⼊⼀些新的元素,⽐如:加⼊⼀个新的⼈物⾓⾊、新的时间线,都会需要⼤量更改故事线以配合这个新元素的融⼊,甚⾄对原有⽂章造成破坏性的影响。
为了解决这个问题,⼈们总结出了很多种⽂章结构,例如:总-分结构,并列结构,总-分-总结构等等,有了这些结构,在加⼊新元素的时候,甚⾄不必考虑新元素与原故事情节的关联性,直接单拉⼀个分⽀故事线独⽴去讲就好了,只要能够在整体故事结束前,与汇聚到主线故事就可以了(是不是很像git?)。
在软件开发领域,也有很多这样的⾮常有⽤的实践总结,我们称之为设计模式。对于设计模式,⼤家都不陌⽣,随便个⼈,估计都能讲出N个设计模式来,但是除了这些设计模式的概念,很多⼈不知道如何灵活运⽤这些设计模式。所以借这篇⽂章和⼤家共同学习设计模式的思想。
⼆理解设计模式
我尽量⽤最通俗易懂的⽰例和语⾔来讲述我理解的设计模式,希望能对⼤家有所帮助。
另外也⽆需精通所有的设计模式,只要能够融汇贯通常见的设计模式,就能让你的代码变得优雅。就像程咬⾦只会三板斧,但是熟练度⽆⼈能及,照样能横⾏天下。
1 ⼯⼚模式(Factory)
简单⼯⼚(Simple Factory)
⼩明追妹⼦的时候,请她喝了不少咖啡,她爱喝卡布奇诺,每次去咖啡店,只要跟服务员说“来杯卡布奇诺”就⾏了,
⼩明追妹⼦的时候,请她喝了不少咖啡,她爱喝卡布奇诺,每次去咖啡店,只要跟服务员说“来杯卡布奇诺”就⾏了,虽然各家的⼝味有些不同,但是不管是星爸爸还是Costa,都能够提供卡布奇诺这种咖啡。这⾥的星爸爸和Costa就是⽣产咖啡的⼯⼚。
(1)简单⼯⼚模式结构
简单⼯⼚模式包含如下⾓⾊:
•Factory:⼯⼚⾓⾊-负责实现创建所有实例的内部逻辑.
•Product:抽象产品⾓⾊-是所创建的所有对象的⽗类,负责描述所有实例所共有的公共接⼝。•ConcreteProduct:具体产品⾓⾊-是创建⽬标,所有创建的对象都充当这个⾓⾊的某个具体类的实例。
结构图:
时序图:
(2)优缺点
•优点:客户类和⼯⼚类分开。消费者任何时候需要某种产品,只需向⼯⼚请求即可。消费者⽆须修改就可以接纳新产品。
产品。
•缺点:是当产品修改时,⼯⼚类也要做相应的修改。
⼯⼚⽅法(Factory Method)
以前经常带⽼婆去优⾐库(简单⼯⼚)买⾐服,就那么多款式,逛的次数多了,她就烦了。后来我改变策略,带⽼婆去逛商场(抽象⼯⼚),商场⾥有各式品牌的店铺,不⽤我管,她⾃⼰就能逛上⼀整天。区别于简单⼯⼚,核⼼⼯⼚类(商场)不再负责所有产品的创建,⽽是将具体创建的⼯作交给⼦类(服装店)去做,成为⼀个抽象⼯⼚⾓⾊,仅负责给出具体⼯⼚类必须实现的接⼝(门店),⽽不接触哪⼀个产品类应当被实例化这种细节。
(1)⼯⼚⽅法模式结构
⼯⼚⽅法模式包含如下⾓⾊:
•Product:抽象产品
•ConcreteProduct:具体产品
•Factory:抽象⼯⼚
•ConcreteFactory:具体⼯⼚
结构图:
时序图:
⼯⼚模式总结
(1)适⽤场景
输出的产品是标准品,谁来做都可以。
(2)举例
常见的数据库连接⼯⼚,SqlSessionFactory,产品是⼀个数据库连接,⾄于是oracle提供的,还是mysql提供的,我并不需要关⼼,因为都能让我通过sql来操作数据。
(3)注意事项
项⽬初期,软件结构和需求都没有稳定下来时,不建议使⽤此模式,因为其劣势也很明显,增加了代码的复杂度,增加了调⽤层次,增加了内存负担。所以要注意防⽌模式的滥⽤。
(4)简单实现
package FactoryMethod;
public class FactoryPattern
{
public static void main(String[] args)
{
Factory factory = new ConcreteFactoryA();
Product product = ateProduct();单例模式的几种实现方式
product.use();
}
}
//抽象产品:提供了产品的接⼝
interface Product
{
public void use;
}
//具体产品A:实现抽象产品中的抽象⽅法
class ConcreteProductA implements Product
{
public void use()
{
System.out.println("具体产品A显⽰...");
}
}
//具体产品B:实现抽象产品中的抽象⽅法
class ConcreteProductB implements Product
{
public void use()
{
System.out.println("具体产品B显⽰...");
}
}
//抽象⼯⼚:提供了⼚品的⽣成⽅法
interface Factory
{
public Product createProduct();
}
//具体⼯⼚A:实现了⼚品的⽣成⽅法
class ConcreteFactoryA implements AbstractFactory {
public Product createProduct()
{
System.out.println("具体⼯⼚A⽣成-->具体产品A."); return new ConcreteProductA();
}
}
//具体⼯⼚B:实现了⼚品的⽣成⽅法
class ConcreteFactoryB implements AbstractFactory
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论