<android>单例模式  Build模式  观察者模式  工厂模式  适配器模式 代理模式

本文详细介绍了单例模式、建造者模式、观察者模式、工厂模式及适配器模式的具体实现方式及其应用场景。

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

单例模式  Build模式  观察者模式  工厂模式  适配器模式

 

单例模式:

/**
 * 单例模式
 * 1.每次从getInstance()都能返回一个且唯一的一个对象。
 * 2.资源共享情况下,getInstance()必须适应多线程并发访问。
 * 3.提高访问性能。
 * 4.懒加载(Lazy Load),在需要的时候才被构造。
 */

public class SingletonMode {

    /**
     * 单例模式 懒汉式   缺点:不适应多线程并发访问。
     */
    public static class SingletonModeA {
        private static SingletonMode instance;

        public static SingletonMode getInstance() {
            if (instance == null) {
                instance = new SingletonMode();
            }
            return instance;
        }
    }


    /***
     * 单例模式 懒汉式   缺点:加锁性能瓶颈 耗时大
     */
    public static class SingletonModeB {
        private static SingletonModeB instance;

        public static synchronized SingletonModeB getInstance() {
            if (instance == null) {
                instance = new SingletonModeB();
            }
            return instance;
        }
    }


    /**
     * 单例模式 饿汉式   缺点:不能带参数
     */

    public static class SingletonModeC {
        private static SingletonModeC instance = new SingletonModeC();

        public static SingletonModeC getInstance() {
            return instance;
        }
    }


    /**
     * 单例模式 懒汉式的  优点:同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖JDK版本。
     */

    public static class SingletonModeD implements Serializable {

        private static class SingletonHoulder {
            static final SingletonModeD sinletonMode = new SingletonModeD();
        }

        public static SingletonModeD getInstance() {
            return SingletonHoulder.sinletonMode;
        }

        // private的构造函数用于避免外界直接使用new来实例化对象
        private SingletonModeD() {
        }

        //readResolve方法应对单例对象被序列化时候
        public Object readResolve() {
            return getInstance();
        }

    }

 

Build模式:

/**
 * build模式
 * Created by LG on 2018/8/20.
 */

public class BuildMode {
    private int icon;
    private String title;
    private String message;
    private boolean isCancel;

    //使用
    public void use() {
        BuildMode.Buidler buidler = new BuildMode.Buidler();
        buidler.setIcon(1)
                .setCancel(true)
                .setMessage("build模式")
                .setTitle("标题")
                .builder();
    }


    private BuildMode(Buidler buidler) {
        this.icon = buidler.icon;
        this.title = buidler.title;
        this.message = buidler.message;
        this.isCancel = buidler.isCancel;
    }

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public boolean isCancel() {
        return isCancel;
    }

    public void setCancel(boolean cancel) {
        isCancel = cancel;
    }

    static class Buidler {

        private int icon;
        private String title;
        private String message;
        private boolean isCancel;

        public int getIcon() {
            return icon;
        }

        public Buidler setIcon(int icon) {
            this.icon = icon;
            return this;
        }

        public String getTitle() {
            return title;
        }

        public Buidler setTitle(String title) {
            this.title = title;
            return this;
        }

        public String getMessage() {
            return message;
        }

        public Buidler setMessage(String message) {
            this.message = message;
            return this;
        }

        public boolean isCancel() {
            return isCancel;
        }

        public Buidler setCancel(boolean cancel) {
            isCancel = cancel;
            return this;
        }

        public BuildMode builder() {

            return new BuildMode(this);
        }
    }

观察者模式:

/**
 * 观察者模式
 * Created by LG on 2018/8/20.
 */

public class ObserverMode {


    // 使用
    public void use() {

        //添加观察者
        MyObservable myObservable = new MyObservable();
        MyObserver myObserver = new MyObserver(1);
        myObservable.addObserver(myObserver);

        //改变数据
        myObservable.setName("观察者模式");
        myObservable.setAge(10);
        myObservable.setSex("男");

    }


    /**
     * 被观察者
     */
    class MyObservable extends Observable {

        private String name;
        private int age;
        private String sex;


        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
            setChanged();
            notifyObservers();
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
            setChanged();
            notifyObservers();
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
            setChanged();
            notifyObservers();
        }


        @Override
        public String toString() {
            return "MyPerson [name=" + name + ", age=" + age + ", sex=" + sex + "]";
        }
    }


    /**
     * 观察者
     */
    class MyObserver implements Observer {
        private int id;
        private MyObservable myObservable;

        public MyObserver(int id) {
            this.id = id;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public MyObservable getMyObservable() {
            return myObservable;
        }

        public void setMyObservable(MyObservable myObservable) {
            this.myObservable = myObservable;
        }

        @Override
        public void update(Observable observable, Object o) {
            this.myObservable = (MyObservable) observable;
        }
    }

工厂模式:

/**
 * 工厂模式
 * Created by LG on 2018/8/20.
 */

public class FactoryMode {


    /**
     * 简单工厂模式
     */

    static class SimpleFactory {

        public void use() {
            INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_LZ);
            noodles.desc();
        }

        //抽象方法
        public abstract static class INoodles {
            public abstract void desc();
        }

        //产品类
        public static class LzNoodles extends INoodles {
            @Override
            public void desc() {
                System.out.println("刀削面");
            }
        }

        //产品类
        public static class PaoNoodles extends INoodles {
            @Override
            public void desc() {
                System.out.println("泡面");
            }
        }

        //工厂类
        public static class SimpleNoodlesFactory {
            public static final int TYPE_LZ = 1;//刀削面
            public static final int TYPE_PM = 2;//泡面

            public static INoodles createNoodles(int type) {
                switch (type) {
                    case TYPE_LZ:
                        return new LzNoodles();
                    case TYPE_PM:
                        return new PaoNoodles();
                    default:
                        return new PaoNoodles();
                }
            }
        }
    }


    /**
     * 抽象工厂模式
     */

    static class AbstractFactory {
        //使用
        public void use() {
            IFactory factory = new Factory();
            factory.createProduct1().show();
            factory.createProduct2().show();
        }

        interface IProduct1 {
            public void show();
        }

        interface IProduct2 {
            public void show();
        }

        class Product1 implements IProduct1 {
            public void show() {
                System.out.println("这是1型产品");
            }
        }

        class Product2 implements IProduct2 {
            public void show() {
                System.out.println("这是2型产品");
            }
        }

        interface IFactory {
            public IProduct1 createProduct1();

            public IProduct2 createProduct2();
        }

        public class Factory implements IFactory {
            public IProduct1 createProduct1() {
                return new Product1();
            }

            public IProduct2 createProduct2() {
                return new Product2();
            }
        }

    }

适配器模式:

/**
 * 适配器模式
 * Created by LG on 2018/8/20.
 */

public class AdapterMode {

    /**
     * 对象/类 适配器模式
     */
    static class ClassAdapter {

        public void use() {
            Xiaomi mi1 = new Xiaomi();
            mi1.takeAlong();
            mi1.store();
        }

        public interface Usb {
            void store();

            void takeAlong();
        }

        public class Phone {
            public void call() {
                System.out.println("Phone call");
            }

            public void sms() {
                System.out.println("Phone sms");
            }

            public void takeAlong() {
                System.out.println("Phone takeAlong");
            }
        }

        /**
         * 类的适配器模式
         * phone + Usb
         * 将Phone的功能扩展到Usb里
         */
        public class Xiaomi extends Phone implements Usb {

            @Override
            public void store() {
                // TODO Auto-generated method stub
                System.out.println("store implements usb");
            }
        }

        /**
         * 对象的适配器模式
         */

        public class XiaomiWrapper implements Usb {

            private Phone phone;

            public XiaomiWrapper(Phone phone) {

                this.phone = phone;
            }

            @Override
            public void store() {
                // TODO Auto-generated method stub
                System.out.println("store implements usb");

            }

            @Override
            public void takeAlong() {
                // TODO Auto-generated method stub
                phone.takeAlong();
            }

        }


        /**
         * 接口适配器
         */
        static class ImplementAdapter {

            public void use() {

                Phone1 p1 = new Phone1();
                Phone2 p2 = new Phone2();
                p1.store();
                p2.takeAlong();
            }

            /**
             * 接口的适配器模式
             * 1.借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法
             * 2.继承类可以选择性的实现接口中的方法
             */
            public abstract class AbsPhone implements Usb {

                public void store() {
                    System.out.println("AbsPhone implements usb's store methond");
                }

                public void takeAlong() {
                    System.out.println("AbsPhone implements usb's takeAlong methond");
                }
            }


            public class Phone1 extends AbsPhone {

                public void call() {
                    System.out.println("Phone1 call");
                }

                public void sms() {
                    System.out.println("Phone1 sms");
                }

                public void store() {
                    System.out.println("Phone1 need usb's store methond");
                }

            }


            public class Phone2 extends AbsPhone {

                public void call() {
                    System.out.println("Phone2 call");
                }

                public void sms() {
                    System.out.println("Phone2 sms");
                }

                public void takeAlong() {
                    System.out.println("Phone2 need usb's takeAlong methond");
                }
            }
        }
    }

 

还差一个代理模式,会及时更新。

 

 

<think>好的,用户现在问的是Android常用的设计模式。首先,我需要回顾一下之前的历史对话,用户之前问过动态权限申请框架,可能是一个Android开发者,特别是新手或者中级开发者,想要提升自己的代码结构。现在他想了解设计模式,可能是因为在开发过程中遇到了代码维护或架构上的问题,想要学习如何更好地组织代码。 接下来,我要确定用户的需求。设计模式有很多种,但Android开发中常用的有哪些呢?需要分门别类,并且给出具体的例子,这样用户更容易理解。用户可能希望得到一个结构清晰、分类明确的回答,可能包括创建型、结构型、行为型模式,以及一些Android特有的模式,比如MVVM之类的架构模式。 然后,我需要考虑回答的结构。可能先概述设计模式的重要性,再分点介绍每种模式,每个模式给出定义、使用场景、Android中的例子,以及优缺点。还要注意使用中文,符合之前的格式要求,比如代码示例用正确的语法,行内公式用$...$,独立公式用$$...$$,不过在设计模式中可能公式较少,但如果有的话需要注意。 还要注意用户之前的问题中提到的动态权限框架,可能用户对实际应用场景比较感兴趣,所以在举例时要结合Android开发中的实际案例,比如Activity的启动用到了工厂模式,Retrofit使用建造者模式等,这样用户更容易理解。 另外,用户可能需要知道如何选择合适的设计模式,所以在最后给出选择建议,根据项目规模和团队经验推荐不同的模式。同时,注意事项部分要提醒不要过度设计,结合架构模式使用,保持代码简洁。 需要检查是否有遗漏的常用模式,比如单例模式在Android中的应用需要注意内存泄漏,观察者模式在LiveData中的使用,这些都很重要。还有MVVM虽然属于架构模式,但用户可能也会感兴趣,可以简要提及。 最后,确保回答符合用户要求的格式,使用标题、代码块、列表等,结构清晰,帮助用户逐步理解。避免使用过于专业的术语,保持解释通俗易懂,同时保证准确性。</think>以下是对Android开发中常用设计模式的系统介绍,按模式类型分类并附上典型应用场景及代码示例: \#\# 一、创建型模式 1. **单例模式 (Singleton)** - 应用场景:全局配置类、日志工具、数据库访问对象 - Android实现要点: ```kotlin class AppConfig private constructor() { companion object { @Volatile private var instance: AppConfig? = null fun getInstance(): AppConfig = instance ?: synchronized(this) { instance ?: AppConfig().also { instance = it } } } } // 注意:Android中需谨慎使用单例,避免持有Context导致内存泄漏 ``` 2. **建造者模式 (Builder)** - 典型应用:AlertDialog构建、Retrofit配置 - 示例: ```java AlertDialog dialog = new AlertDialog.Builder(context) .setTitle("提示") .setMessage("确认删除?") .setPositiveButton("确定", null) .create(); ``` 3. **工厂模式 (Factory)** - 应用场景:Fragment实例化、网络请求工厂 - 代码示例: ```kotlin interface ApiClient { fun request(): Response } class ApiFactory { fun create(type: String): ApiClient = when(type) { "retrofit" -> RetrofitClient() "volley" -> VolleyClient() else -> throw IllegalArgumentException() } } ``` \#\# 二、结构型模式 4. **适配器模式 (Adapter)** - Android典型实现:RecyclerView.Adapter - 代码结构: ```kotlin class MyAdapter(val dataList: List<Data>) : RecyclerView.Adapter<ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { // 创建视图 } override fun onBindViewHolder(holder: ViewHolder, position: Int) { // 绑定数据 } } ``` 5. **装饰器模式 (Decorator)** - 应用场景:Java IO流处理、自定义View增强 - 示例: ```java InputStream input = new BufferedInputStream( new FileInputStream("test.jpg")); ``` 6. **代理模式 (Proxy)** - Android应用:Binder跨进程通信、Retrofit接口代理 - 动态代理示例: ```java public interface ApiService { @GET("user/info") Call<User> getUserInfo(); } Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).build(); ApiService service = retrofit.create(ApiService.class); // 动态代理实现 ``` \#\# 三、行为型模式 7. **观察者模式 (Observer)** - Android实现:LiveData事件通知、RxJava - LiveData示例: ```kotlin val liveData = MutableLiveData<String>() liveData.observe(this, Observer { value -> updateUI(value) }) liveData.postValue("新数据") ``` 8. **策略模式 (Strategy)** - 应用场景:图片加载策略(Glide/Picasso切换)、支付方式选择 - 代码示例: ```java interface CompressionStrategy { void compress(File file); } class ImageProcessor { private CompressionStrategy strategy; public void setStrategy(CompressionStrategy strategy) { this.strategy = strategy; } public void processImage() { strategy.compress(imageFile); } } ``` 9. **模板方法模式 (Template Method)** - Android应用:AsyncTask执行流程、BaseActivity封装 - 示例: ```java abstract class BaseActivity extends Activity { // 模板方法 protected final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initData(); setupViews(); bindEvents(); } abstract void initData(); abstract void setupViews(); abstract void bindEvents(); } ``` \#\# 四、Android特化模式 10. **依赖注入模式** - 实现框架:Dagger/Hilt、Koin - Hilt示例: ```kotlin @HiltViewModel class MyViewModel @Inject constructor( private val repository: DataRepository ) : ViewModel() { ... } ``` 11. **MVVM架构模式** - 核心组件:ViewModel + LiveData + DataBinding - 数据绑定示例: ```xml <layout> <data> <variable name="viewModel" type="com.example.MyViewModel"/> </data> <TextView android:text="@{viewModel.userName}"/> </layout> ``` \#\# 五、模式选择建议 - 基础功能开发:优先使用$$观察者模式$$、$$适配器模式$$等基础模式 - 复杂业务逻辑:结合$$策略模式$$、$$模板方法模式$$进行解耦 - 架构设计:采用$$MVVM$$+$$依赖注入$$等组合模式 - 性能敏感场景:慎用$$装饰器模式$$(可能产生对象嵌套) \#\# 六、注意事项 1. 避免过度设计:简单功能直接实现,不需要强制套用模式 2. 组合优于继承:优先使用对象组合(如$$策略模式$$)而非类继承 3. 关注Android特性:考虑生命周期管理(如ViewModel的自动保存) 4. 与架构模式配合:结合Clean Architecture、MVI等现代架构 建议通过Android官方架构组件(如ViewModel、LiveData、Room)来自然应用这些设计模式,新项目推荐采用MVVM+Repository模式作为基础架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值