个人理解,如有不足和出错的地方,欢迎指出
本文将用三种模式实现同一个程序,程序的功能是输入非负整数(会判断输入的合法性),判断奇偶性
界面如下:

Java中三种常用设计模式:单例、简单工厂、MVC_java设计模式

校验奇偶性.png

1.单例模式

单例顾名思义就是只有一个实例,下面的Num类就是单例类
工程中只有两个文件:
parity.java
Num.java

parity.java:

public class parity{
   public static void main(String[] args) {
       (Num.getInstance()).readInput();
    }
}

Num.java:

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Num{
    private static Num instance=new Num();
    private Num(){
    }
    public static Num getInstance(){
        return instance;
    }
    public void readInput(){
        Scanner in=new Scanner(System.in);
        boolean isEven=false;
        String next;
        System.out.println("input your datas:");
        //输入部分
        while(in.hasNext()){
            next=in.next();
            Pattern p=Pattern.compile("[0-9]*");//正则表达式的方式验证输入
            //的字符串是否为非负整数
            Matcher m=p.matcher(next);
            if(m.matches()){//输入的字符串是非负整数
                isEven= Parity(Integer.parseInt(next));
                if(isEven) System.out.println(next+" is even");
                else System.out.println(next+" is odd");
            }else{
                System.out.println(next+" is not the the positive integer or zero");
            }
        }
    }
    public  boolean Parity(int number){
        if(number%2==0){
            return true;
        }else{
            return false;
        }
    }
}

要实现单体模式,拿Num类来说,首先构造函数必须私有,保证无法在Num类外创建Num的实例,除此应该有一个public(Num外可访问)、static(无需创建实例即可访问)的方法,用于get到唯一的实例。

2.简单工厂模式

定义一个工厂类,类中定义一个静态方法,依据传入的参数,生成对应的具体产品对象,返回的是这些具体产品对象的公共接口

工程中有三个文件:
Factory.java(自定义的工厂类)

public class Factory{

    public static integer createProduct(String type){//工厂方法
        if(type.equals("even")){
            return new Even();
        }
        if(type.equals("odd")){
            return new Odd();
        }
        else return null;
    }
}

integer.java()定义接口和实现类)

public interface integer{
    public boolean judge(int number);
}
class Even implements integer{
    @Override
     public boolean judge(int number){
       if(number%2==0) return true;
       else return false;
    }
}

class Odd implements integer{
    @Override
    public boolean judge(int number){
       if(number%2!=0) return true;
       else return false;
    }
}

Main.java(接受输入进行判断)

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main{
   public static void main(String[] args) {

        Scanner in=new Scanner(System.in);
        boolean isEven=false;
        String next;
        System.out.println("input your datas:");
        while(in.hasNext()){
            next=in.next();
            Pattern p=Pattern.compile("[0-9]*");
            Matcher m=p.matcher(next);
            if(m.matches()){
                integer number=Factory.createProduct("even");
                isEven=number.judge(Integer.parseInt(next));
                if(isEven){
                    System.out.println(next+" is even");
                }else{
                    System.out.println(next+" is odd");
                }
            }else{
                System.out.println(next+" is not the positive integer or zero");
            }
        }
    }

}
3.MVC模式

MVC是3种里面最复杂的
M-----model层,负责数据的存储和数据的业务处理(如网络请求数据等),数据更新后回调通知视图层(view层)更新界面
V-----view层,显示界面,将用户的输入数据和指令传递给C层进行处理
C----controller层,负责从V层读取用户输入的数据和指令,调用M层获取数据,以实现M与V一定程度上的解耦

程序有4个文件
Main.java
view.java
model.java(数据的业务处理,与bean.java同属于M层)
bean.java(存储数据结构,与model.java同属于M层)
controller.java

Main.java

public class Main{
   public static void main(String[] args) {
         view mView=new view();
    }
}

view.java

import java.util.Scanner;
public class view{//视图层,负责界面的显示、传递用户指令和用户输入
//的数据给C层
    private controller mController;
    public view(){
        mController=new controller();
        readInput();
    }
    public void Print(String num,boolean isEven){
        if(isEven){
            System.out.println(num+" is even");
        }else{
            System.out.println(num+" is odd");
        }
    }
    public void readInput(){
        Scanner in=new Scanner(System.in);
        boolean isEven=false;
        String next;
        System.out.println("input your datas:");
       //读取用户输入的数据,传给mController,OnUpdateListener是一个回//调的接口,当数据更新结束后回调通知V层更新界面
        while(in.hasNext()){
            next=in.next();
            mController.judge(next,new OnUpdateListener(){
                @Override
                public void onSuccess(Object oj){
                    bean data=(bean)oj;
                    Print(String.valueOf(data.getNum()),data.getIsEven());
                }
                @Override
                public void onFail(String message){
                    System.out.println(message);
                }

            });
        }
    }

    public interface OnUpdateListener{
       void onSuccess(Object oj);
       void onFail(String message);
    }  
}

controller.java

public class controller{//控制层,接受视图层的用户数据和指令,调用model层获取数据
    private model mModel;
    private view mView;
    public controller(){
          mModel=new model();
    }
    public void judge(String input, view.OnUpdateListener listener){
          mModel.requestData(input,listener);
    }
}

接下来看M层
model.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class model{//数据层的逻辑处理
    private bean data;
    public model(){
        data=new bean();
    }
    public void requestData(String input,final view.OnUpdateListener listener){
            Pattern p=Pattern.compile("[0-9]*");
            Matcher m=p.matcher(input);
            boolean isEven=false;
            if(m.matches()){
                int num=Integer.parseInt(input);
                data.setNum(num);
                if(num%2==0) {
                    data.setIsEven(true);
                }else{
                    data.setIsEven(false);
                }
                listener.onSuccess(data);//回调
            }else{
                listener.onFail(input+" is not the positive integer");//回调
            }
    }
}

bean.java

public class bean{//数据层的数据对象
    private int num;
    private boolean isEven;
    public int getNum(){
        return num;
    }
    public void setNum(int num){
        this.num=num;
    }
    public boolean getIsEven(){
        return isEven;
    }
    public void setIsEven(boolean isEven){
        this.isEven=isEven;
    }
}



作者:LingoGuo
链接:http://www.jianshu.com/p/118a94bac633
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。