万恶的设计模式-创建模式与应用详解

这些年不提点设计模式你都不好意思说你是java程序员。但是理解设计模式的感觉很少,虽然你找到很多资料,看了很多实例,阅读了很多大牛的blog,但是你还是不知道什么是设计模式,在什么情况下用什么设计模式,用了设计模式给我们带来了什么样的方便。今天我也来戏说一下设计模式。

在我看来,一切工作都是设计。哲学家设计人类的思想和行为方法,程序员设计流程与代码,销售员设计销售策略和营销方式,政府设计国家发展纲要以及施政策略,等等一切工作,我们都可能把他们看成设计。但是我们需要一种好的思路去引导我们的设计是快捷方便的(可操作性),好勾通协作的(可维护性),但又是独立性强(低耦合性)的。于是我们的政府出现了各种不同的部门,各部门实施自己的工作,同时各个部门又分上下级,划分责任区域,执行一个流程链(责任链),而不同的部门之间又要有协作的小部门来维护关系(接口)。好吧,也许文字还是太难受,我们还是用程序员的思维来解说吧:我们来构建我们的政府。

首先,国家刚建立,我们需要成立我们的行政部门。假如我们成立了教育部,于是有

public class Education {

    public void serve_the_people() {
        System.out.println("Ministry Of Education Serves Our People!");
    }
}
然后我们继续成立人民银行

public class PeoplesBank {

    public void serve_the_people() {
        System.out.println("People's Bank Serves Our People");
    }

}
然后我们还会成立很多很多的部门,但是我们发现我们的部门都有一个共同的特点,那就是要为人民服务!于是我们就深刻认识到一个问题我们所成立的部门就是要为人民服务的,于是我们把这个标准指出来,不过具体怎么为人民服务我们就不关心了,于是:

public interface Department {

    public void serve_the_people();
}
以后所有的部门必须遵循这个原则。首先教育部你要遵守为人民服务的标准,但他是为了老百姓的口袋:

public class Education implements Department {

    @Override
    public void serve_the_people() {
        System.out.println("Ministry Of Education Serves Our People!");
    }
}
接着人民银行你也要遵守,但他是为了老百姓的文化水平:

public class PeoplesBank implements Department {

    @Override
    public void serve_the_people() {
        System.out.println("People's Bank Serves Our People");
    }

}
这样,我们老百姓就可以去这些部门办事了,因为他们都是为我们服务的。以后不管成立科技部,工业部,还是农业部等等都按这一准则去执行。而我们成立部门的过程就完全可以按这一框架进行(是不是就像生产东西一样,我们有了一个标准后,于是就按这一标准成立部门 --这就是 工厂模式)。当然我们要给这些部门立个牌子( 简单工厂的参数),老百姓看到牌子了就知道有什么服务了:

public class DepartmentFactory {
    public Department createDepartment(String departmentName) {
        switch (departmentName) {
            case "教育部":
                return new Education();
            case "人民银行":
                return new PeoplesBank();
            default:
                return null;
        }
    }
}
然后我们老百姓也就知道怎么享受这些服务了,看到人民银行的牌子我们就去银行:

public class People {

    public static void main(String[] args) {
        DepartmentFactory departmentFactory = new DepartmentFactory();
        Department department = departmentFactory.createDepartment("人民银行");
        department.serve_the_people();
    }
}
好吧,外国朋友又会郁闷了,哪里郁闷了?因为他根本不懂中文,【教育部】,【人民银行】的牌子他不知道什么意思。哪怎么办?于是我们需要提供一个统一的方式告诉他,比如大家都看得懂的方法告诉他怎么做(这就是 工厂方法)。于是我们修改一下我们的牌子,或者说是去掉了我们的牌子:

public class DepartmentFactory {

//    public Department createDepartment(String departmentName) {
//        switch (departmentName) {
//            case "教育部":
//                return new Education();
//            case "人民银行":
//                return new PeoplesBank();
//            default:
//                return null;
//        }
//    }
    
    public Department createBank() {
        return new PeoplesBank();
    }

    public Department createEducation() {
        return new Education();
    }
}
然后他就可以容易的找到他想要找的部门

public class People {

    public static void main(String[] args) {
        DepartmentFactory departmentFactory = new DepartmentFactory();
//        Department department = departmentFactory.createDepartment("人民银行");
        Department department = departmentFactory.createBank();
        department.serve_the_people();
    }
}
可是你发现我们这银行很多,你去银行服务的话你根本不知道去哪个?你有选择恐惧症,你心里面想的只要是银行就行了,所以你说我就要银行就得了(这不就是 静态工厂方法么),才不管他是什么银行:

public class DepartmentFactory {

//    public Department createDepartment(String departmentName) {
//        switch (departmentName) {
//            case "教育部":
//                return new Education();
//            case "人民银行":
//                return new PeoplesBank();
//            default:
//                return null;
//        }
//    }
    
    public static Department createBank() {
        return new PeoplesBank();
    }

    public static Department createEducation() {
        return new Education();
    }
}
于是你就不用想那么多了,直接找银行就得了:

public class People {

    public static void main(String[] args) {
//        DepartmentFactory departmentFactory = new DepartmentFactory();
        Department department = departmentFactory.createDepartment("人民银行");
//        Department department = departmentFactory.createBank();
        Department department = DepartmentFactory.createBank();
        department.serve_the_people();
    }
}
成了两个部门以后,你发现还有很多部门也要成立。而成立之后的话,你就需要改进现在的成立机制,为什么要改呢?因为新的部门虽然都是为了百姓服务,但是服务的内容还是不一样的,你得让老百姓知道你新成立的部门是不一样的,于是在增加部门(如下代码)的同时,

public class Agriculture implements Department {

    @Override
    public void serve_the_people() {
        System.out.println("Ministry Of Agriculture Serves Our People!");
    }
}

DepartmentFactory就得加一个成立其他部门的方法(如下代码),

public class DepartmentFactory {

    public static Department createBank() {
        return new PeoplesBank();
    }

    public static Department createEducation() {
        return new Education();
    }

    public static Department createAgriculture() {
        return new Agriculture();
    }
}

不过政府没有那么死板,因为我们会创新思维,那就是把成立部门机制的的问题也做一套标准,这个就是成立部门的机制(这就是所谓的抽象工厂方法):

public interface AbstractDepartmentFactory {

    public Department create();
}
然后让成立部门的机制按上面的标准执行,于是成立银行的准则变为

public class PeopleBankFactory implements AbstractDepartmentFactory{
    @Override
    public Department create() {
        return new PeoplesBank();
    }
}
而成立其他部门的方式也按这个来。而老百姓寻求帮助的方式也有所改变

public class People {

    public static void main(String[] args) {
//        DepartmentFactory departmentFactory = new DepartmentFactory();
        Department department = departmentFactory.createDepartment("人民银行");
//        Department department = departmentFactory.createBank();
//        Department department = DepartmentFactory.createBank();
        AbstractDepartmentFactory adeportmentfactory = new PeopleBankFactory();
        Department department = adeportmentfactory.create();
        department.serve_the_people();
    }
}

可是,我们有很多很多部门啊,当时政府报备部门名称的官员(腐败弱智分子)居然连注册过的部门名字都不知道,他居然注册了两个教育部。所以我们希望我们有先进的机制,不管这官员多弱智,我们也不会出现这个问题。于是我们需要(单例模式),让我们的部门永远只会产生一个,于是我们修改我们的人民银行构造方法:

public class PeoplesBank implements Department {

    public static PeoplesBank peoplebank = null;

    private PeoplesBank() {
    }

    public static PeoplesBank getPeoplesBankInstance() {
        if (peoplebank == null) {
            peoplebank = new PeoplesBank();
        }
        return peoplebank;
    }

    @Override
    public void serve_the_people() {
        System.out.println("People's Bank Serves Our People");
    }

}
我们首先保证构造函数是私有的,防止在外部直接实例化。我们还把自身的对象设置为空,这主要是为了延迟加载的作用。当然这个单例是脆弱的,比如很多郭嘉可能同时成立人民银行,这样不能保证真正的唯一性。我们优化一下我们的方式,在成立一个部门的时候其他的人不能插手干预

    public synchronized static PeoplesBank getPeoplesBankInstance() {
        if (peoplebank == null) {
            peoplebank = new PeoplesBank();
        }
        return peoplebank;
    }
但是这可能还是会有其他问题,这个问题大家可以查看其他资料。

单例问题我们解决了,但同时使用单例的方式也会发生变化,因为默认构造函数是私有的,现在只能通过实例方法实现了

public class PeopleBankFactory implements AbstractDepartmentFactory {

    @Override
    public Department create() {
        return PeoplesBank.getPeoplesBankInstance();
    }

}



----------------------------------------------------------------------------------------------------------------------

稍稍离开 下节builder模式与应用详解更精彩 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值