工作中的几种设计模式

1.单例模式

synchronized public static ImCache getInstance   (Context context) {
    if (sInstance == null) {
        sInstance = new ImCache(context);
    }
    return sInstance;
}
优点
  • 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。
  • 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
  • 单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
  • 单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
缺点
  • 单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

2.builder模式

    ImSession session = sb.looper(mImModule.getLooper())
            .listener(mImModule)
            .config(mImModule.getImConfig())
            .imsService((IImServiceInterface)HandlerFactory.getStackAdaptor(IImServiceInterface.class))
            .slmService((ISlmServiceInterface)HandlerFactory.getStackAdaptor(ISlmServiceInterface.class))
            .uriGenerator(mImModule.getUriGenerator())
            .mnoStrategy(mImModule.getMnoSpecificStrategy())
            .chatId(StringIdGenerator.generateChatId(participants, participants.size() > 1))
            .participantsUri(participants)
            .ownPhoneNum(mImModule.getOwnPhoneNum())
            .subject(event.mWelcomeNote)
            .contributionId(event.mContributionId)
            .conversationId(event.mConversationId)
            .sdpContentType(event.mSdpContentType)
            .direction(ImDirection.INCOMING)
            .rawHandle(event.mIsDeferred ? null : event.mRawHandle)
            .capability(mImModule.getChatSessionCapability())
            .sessionType(event.mSessionType)
            .build();
  • 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节;
  • 建造者独立,容易扩展;
  • 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

3.adapter模式

public interface IDataAdapter {
/**
 * this method will adapt the xml element to profileData
 *
 * @param element the input xml element
 * @return the output profileData
 */
public ProfileData buildProfileData(Element element);

/**
 * this method will adapt the profileData to xml element
 *
 * @param profileData the input profileData
 * @param document the input W3G document, which will used to make element
 * @return the output xml element
 */
public Element buildXmlElement(ProfileData profileData, Document document);

/**
 * compare the two ContentValues and return the compare result
 * <p>
 * this method is used to compare two profileInfo,
 *
 * @param valuesA the input ContentValues to be compared
 * @param valuesB the input ContentValues to be compared
 * @return the compare result: {@link CompareResult}
 */
public int compare(ContentValues valuesA, ContentValues valuesB);

public String getMimeType();

public String getTagName();

public String getElementType();

public interface CompareResult {
    public final static int SAME = 0;
    public final static int SHOULD_UPADATE = 1;
    public final static int NOT_RELATED = -1;
}
}
优点
  • 更好的复用性

      系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

  • 更好的扩展性

      在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

缺点
  • 过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

4.观察者模式

    mPersister = new ImPersister(mContext, mImModule);
    addObserver(mPersister);

    chatData.triggerObservers(ImCacheAction.INSERTED);

    public void update(Observable observable, Object data) {
        ChatData chatData = (ChatData) observable;
        ImCacheAction action = (ImCacheAction) data;
        if (action == ImCacheAction.INSERTED) {
            insertSession(chatData);
        } else if (action == ImCacheAction.UPDATED) {
            onSessionUpdated(chatData);
        } else if (action == ImCacheAction.DELETED) {
            deleteSession(chatData);
        }
    }
优点

观察者和被观察者之间是抽象耦合

5.策略模式

private static IMnoStrategy createMnoStrategy(Context ctx) {
        String mcc = getMccFromConfiguration();
        String mnc = getMncFromConfigurtion();

        Mno mno = new Mno(Mcc.parseMcc(mcc), Mnc.parseMnc(mnc));
        Log.d(LOG_TAG, "createMnoStrategy " + mno);

        if (sMnoSpecificStrategyGenerator.containsKey(mno)) {
            Class<?> cls = sMnoSpecificStrategyGenerator.get(mno);
            return (IMnoStrategy) cls.getConstructor(Context.class).newInstance(ctx);
        }

策略模式主要用来分离算法,根据相同的行为抽象来做不同的具体策略实现。

通过以上也可以看出策略模式的优缺点:

优点:
  • 耦合度相对而言较低,扩展方便。
  • 操作封装也更为彻底,数据更为安全。
缺点:
  • 随着策略的增加,子类也会变得繁多。

6.proxy模式

 ICapabilityServiceEventListener.Stub mEventProxy = new
            ICapabilityServiceEventListener.Stub() {
    @Override
    public void onOwnCapabilitiesChanged() throws RemoteException   {
        if (mRelay == null) {
            Log.d(LOG_TAG, "no listener for ICapabilityServiceEventListener");
            throw new RemoteException();
        } else {
            mRelay.onOwnCapabilitiesChanged();
        }
    }

给对象增加了本地化的扩展性,增加了存取操作控制

7.组合模式

ServiceModuleManager总体管理各个Module

优点

  • 不破坏封装,整体类与局部类之间松耦合,彼此相对独立 。
  • 具有较好的可扩展性。
  • 支持动态组合。在运行时,整体对象可以选择不同类型的局部对象。

    整体类可以对局部类进行包装,封装局部类的接口,提供新的接口。

缺点

  • 整体类不能自动获得和局部类同样的接口。
  • 创建整体类的对象时,需要创建所有局部类的对象 。

8.装饰模式

output = new BufferedOutputStream(new FileOutputStream (mRequest.mFilePath, mTransferred > 0), bufferSize);
优点
  1. 可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。
  3. 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

9.状态模式

EVENT_SEND_MESSAGE
   -->InitialState
          MessageBase imMsg = (MessageBase) msg.obj;
          onStartSession(imMsg, mIsRejoinable);
   -->EstablishedState
          onSendImMessage((MessageBase) msg.obj);
   -->ClosingState
          ....

它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来

时间: 2024-08-07 00:18:23

工作中的几种设计模式的相关文章

[设计模式](转)Java中的24种设计模式与7大原则

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

工作中常用到的设计模式

在脉脉上看过一个帖子:在工作中最常用的设计模式都有哪些? 总结一下这些出现频率高的设计模式(排名不分先后) 创建型设计模式 工厂模式(简单工厂.抽象工厂.工厂方法) 单例模式 结构型设计模式 装饰器模式 组合模式 行为型设计模式 责任链模式 策略模式 注意: 设计模式不是解决所有问题的灵丹妙药. 不要试图强迫使用他们; 如果这样做的话,会发生坏事. 请记住,设计模式是问题的解决方案,而不是解决问题的解决方案:所以不要过分思考. 如果以正确的方式在正确的地方使用,他们可能是救世主; 否则他们可能会

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

0. Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

c#中的23种设计模式

C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核心是一个抽象工厂类,各种具体工厂类通过抽象工厂类将工厂方法继承下来.如此使得客户可以只关心抽象产品和抽象工厂,完全不用理会返回的是哪一种具体产品,也不用关系它是如何被具体工厂创建的. 抽象工厂模式(Abstract Factory) 抽象工厂模式的主要优点是隔离了具体类的生成,使得客户不需要知道什么

Java开发中的23种设计模式

一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 其实还有两类:并发型模式和线程池模式.用一个图片来整体描述一下: 二.设计模式的六大原则 1.开闭原则(Open Clo

Java开发中的23种设计模式详解

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

Java开发中的23种设计模式详解(转载)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

开发中的23种设计模式详解

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周