JAVA设计模式(二)工厂模式与观察者模式

工厂模式

  工厂模式顾名思义则是类似于一个工厂制造产品的模式。如富士康需要制造自己的产品,而同类产品有多种,如手机有各个品牌和型号一样。 
  明白了工厂模式的含义,我们来想想这个模式具体是怎么回事。首先需要的是一个工厂于是就需要一个Factory类,再次就是需要一个抽象的产品类,如手机这个产品抽象类,该类提供了一些通用的生产手机的属性及方法,最后则是我们具体的手机产品。 
下面就以富士康工厂生产小米,苹果,魅族为例。 
首先定义好我们的抽象类Phone

public class abstract Phone {
    //产品的抽象方法,具体实现由各个产品去完成
    public abstract void productPhone();
}
  • 1
  • 2
  • 3
  • 4

接下来具体产品的定义

public class IPhone extends Phone {
     @Override
        public void productPhone() {
            System.out.println("Iphone开始生产");
        }

}
public class MiPhone extends Phone {
     @Override
        public void productPhone() {
            System.out.println("MiPhone开始生产");
        }

}
public class MeZPhone extends Phone {
     @Override
        public void productPhone() {
            System.out.println("MeZPhone开始生产");
        }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在确定了具体的产品后,需要一个工厂来生产他们。

public class FoxFactor {
    public static Phone createComputer(String type){
        Phone mPhone=null;
            switch (type) {
                case "apple":
                    mPhone=new IPhone();
                   break;
                case "mi":
                    mPhone=new MiPhone();
                    break;
                case "mez":
                    mPhone=new MeZPhone();
                    break;

            }
            return mPhone;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

下面需要生产哪一种手机只需要调用工厂的方法 即可,如果升级生产流程更改只需要修改对应手机类进行了。 
下面是调用方法:

public class CreatPhone {
    public static void main(String[]args){
        FoxFactor.createComputer("mi").start();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5

观察者模式

  观察者模式:属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 
一般来说定义总是很抽象的,我们举个具体的例子来说明。比如去吃烤肉,几个小伙伴都围着炉子等肉熟,肉熟了后就是肉状态的变化,并且通知给想吃的小伙伴,这样小伙伴们就可以快乐的吃肉了。 
  为了实现这种模型,我们先来梳理下思路。首先是观察者,就是想吃肉的小伙伴们。其次就是被烤的肉了,就是被观察者。这两者之间为了较好的解耦可以通过接口来进行通信。因此就有了观察者接口和被观察者接口。 
先来看看被观察者。

public interface ISubjectBBQ {

    //被观察者可以添加、删除、通知观察者
    public void addObserver(PartnerOberver partnerOberver);
    public void deletOberver(PartnerOberver partnerOberver);
    public void notifyProcess(String process);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

实现了接口的被观察者类。

public class SubjectBBQ implements ISubjectBBQ{

    private ArrayList<PartnerOberver> mPartnerObervers = null;

    public  SubjectBBQ() {
        // TODO Auto-generated constructor stub
        mPartnerObervers = new ArrayList<PartnerOberver>();
    }
    @Override
    public void addObserver(PartnerOberver partnerOberver) {
        // TODO Auto-generated method stub
        mPartnerObervers.add(partnerOberver);
    }

    @Override
    public void deletOberver(PartnerOberver partnerOberver) {
        // TODO Auto-generated method stub
        mPartnerObervers.remove(partnerOberver);
    }

    @Override
    public void notifyProcess(String processmsg) {
        //当被观察者状态发生变化的时候就通知到观察者
        // TODO Auto-generated method stub
        for(PartnerOberver partnerOberver : mPartnerObervers) {
            partnerOberver.updata(processmsg);
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

下面是观察者相关代码

public interface IPartnerObserver {
//观察者的方法,用于更新
    public void updata(String processmsg);
}
  • 1
  • 2
  • 3
  • 4
  • 5
public class PartnerOberver implements IPartnerObserver{
    private String name;
    private String favorite;

    public PartnerOberver(String name,String favorite) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.favorite = favorite;
    }
    //根据烤肉进度来决定是否开始吃
    @Override
    public void updata(String processmsg) {
        // TODO Auto-generated method stub
        if(processmsg.equals(favorite)) {
            System.out.println(name+" "+favorite+"开吃了");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

下面是如何使用

public class MyClient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SubjectBBQ mSubjectBBQ = new SubjectBBQ();

        PartnerOberver partnerA = new PartnerOberver("小A", "七分熟");
        PartnerOberver partnerB = new PartnerOberver("小B", "八分熟");
        PartnerOberver partnerC = new PartnerOberver("小C", "十分熟");
        // 为被观察者(烤肉)注册观察者
        mSubjectBBQ.addObserver(partnerA);
        mSubjectBBQ.addObserver(partnerB);
        mSubjectBBQ.addObserver(partnerC);

        //烤肉状态变化
        mSubjectBBQ.notifyProcess("七分熟");
        mSubjectBBQ.notifyProcess("八分熟");
        mSubjectBBQ.notifyProcess("十分熟");
        System.out.println("11");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

小A 七分熟开吃了 
小B 八分熟开吃了 
小C 十分熟开吃了 
观察者模式在Android中有着较多的应用,如在一个adapter钟,数据更新时,notifyDataSetChanged()也是通过观察者模式完成的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值