模式设计

本文深入讲解了设计模式的三大类别,包括创建型、结构型和行为型模式,并详细阐述了每种模式的应用场景及实现原理。同时,文章还对比了不同模式之间的区别,帮助读者更好地理解和运用设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式:

1)以下哪个设计模式不属于创建型模式?
    抽象工厂(abstract factory)
    原型(prototype)
    外观(facade)
    单词(singleton)
    选择:外观模式

2)Java数据库连接库JDBC用到哪种设计模式?
A 生成器
B 桥接模式
C 抽象工厂
D 单例模式
 B.桥接模式。JDBC提供两套接口,一个面向数据库厂商,一个面向JDBC使用者。

3)下面哪一种属于“creational”的设计模式?
 A   Façade
 B   Singleton
 C   Bridge
 D   Composite
 E   上面都不是
    答案选择:B

4)设计模式中,属于结构型模式的有哪些?
    状态模式
    装饰模式
    代理模式
    观察者模式
 答案选择:BC

5) 如果我们的程序需要经常在多种算法中相互替换,我们应该选用哪种设计模式:
A  工厂方法模式
B  策略模式
C  适配器模式
D  责任模式
答案选择:B
参考链接:
http://www.nowcoder.com/questionTerminal/d8b7689dd0ba4112825a139d5cdb755b

6)一个系统,提供多个http协议的接口,返回的结果Y有json格式和jsonp格式。Json的格式为{"code":100,"msg":"aaa"},为了保证该协议变更之后更好的应用到多个接口,为了保证修改协议不影响到原先逻辑的代码,以下哪些设计模式是需要的?协议的变更指的是日后可能返回xml格式,或者是根据需求统一对返回的消息进行过滤。()
 正确答案: A B D  
A Aadapter  适配器
B factory  method  工厂方式
C proxy  代理
D decorator 装饰
E composite  组合
PS解答:
A.Aadapter:新增功能但不能修改原来代码,原来代码实现思路——标准接口Target定义interface, ConcreteTarget就是当前解析json的类(实现 Target接口 ); 新增功能这样实现—— Adaptee是新增功能的所属类,Adapter实现 Target接口并集成 Adaptee,这样的 Adapter就有了新的功能了,因此需要适配器模式。调用实例如下:
public static void main(String[] args) {
// 使用普通功能类
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
// 使用特殊功能类,即适配类
Target adapter = new Adapter();
adapter.request();
}
B. 工厂模式: 为多个http协议的接口,在客户端代码中,告诉要请求的接口名称,会调用不同的类来处理,显然是工厂方法
D. 装饰者模式,是用来动态添加功能的,就是过滤 消息,比如非法字符&&&之类的,消息过长之类
解释二:
为了保证该协议变更之后更好的应用到多个接口    适配器模式;
为了保证修改协议不影响到原先逻辑的代码协议的变更指的是日后可能返回xml格式     工厂模式;
或者是根据需求统一对返回的消息进行过滤/装饰模式


总体来说设计模式分为三大类:
创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。(创建之意)
结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。(重在结构)
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。(有相应的触发动作)

创建型模式
创建模式(creational Pattern):对类实例化过程的抽象,使对象的创建和使用分离。并且暴露公共接口,隐藏内部实现实例如何被创建和组合在一起的具体细节。整个系统符合单一职责原则。思考创建了什么(what)?由谁创建(who),何时创建(when)。
包含具体的有:
简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、 抽象工厂模式(Abstract Factory)
建造者模式(Builder)
原型模式(Prototype)
单例模式(Singleton)

一、
工厂模式:专门负责实例化大量公共接口的类,工厂模式可以动态的决定将哪一个类实例化,而不必要事先知道每一次哟啊实例化哪一个类。(实例即为产品,需要改为不同的对象的时候,也是需要修改工厂类的)————————>工厂中含有很多类的模板
1)简单的工厂模式:根据提供的参数,返回几个类中的可能的一个类的对象,返回的一般都是一个公共的父类和公共方法。
2)工厂方法模式:类创建模式,定义一个创建产品对象的的工厂的接口,将实际创建的工作推迟到工厂接口的子类中。(多态的使用)保持了上面的优点,克服缺点。
3)抽象工厂模式:最为抽象和具有一般性的一种形态。——————指当有多个抽象角色时使用一个一种工厂模式,抽象工厂模式可以向客户端提供一个接口,使客户端不必要指定产品的具体情况下,创建多个产品族中的产品对象。

二、
单例模式(单件模式):
保证在整个应用程序的生命周期中,任何时候,单例类被使用该对象的时候都是只有一个单例对象——>单例模式确保一个类中只有一个实例,且是自行实例化并向整个系统提供这个实例单例模式。
区分全局变量和单例模式:
全局变量:是一个对象的静态引用,全局变量确实可以提供单例模式实现的全局访问这个功能,但是,它并不能够保证应用程序中只有一个实例。编码规范:少用全局变量,因为过多使用造成代码难以读,并且,不能够很好地实现继承。
单例模式:(1)类中保存了它的唯一一个实例,(2)单例类的构造函数必须是私有的,(3)单例类必须提供一个全局访问点。

+(id)sharedManager {
    //创建一个静态的类实例值为nil
    static MyManager*sharedMyManager = nil;

    //定义了一个只是执行一次的变量
    static dispatch_once_t onceToken;

    // dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
   dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
        //这里面的代码块只是会被执行一次
    });
    return sharedMyManager;
}


void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
其中第一个参数onceToken是predicate(谓词,用来过滤判断作用),该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,
第二个参数block则是在整个应用程序中只会被调用一次的代码块。
dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
(oc中以前比较老的的创建单例的模式是线程不安全的)


三、
桥接模式产生原因:同一个类型,有两个变化的维度(两个维度的抽象:一个抽象部分的抽象,一个实现部分的抽象)
Bridge模式是一种抽象与其实现相分离的模式。它主要应用于:当事物是一组变化量,和对这些事物的操作方法(实现)也是一组变化量的情况,也就是说它们都是多变的。

四、
组合模式(Composite)属于结构性模式,它描述了对象间的组合关系。对象间常常通过树结构来组织(包含)起来,以实现整体-部分的层次结构。

五、

Facade 外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。


相关比较图片:








 SPA(single page app)单页面应用是移动端常用的开发模式,请使用伪码设计一个SPA前端框架。

参考链接:

http://segmentfault.com/a/1190000000607661





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值