程序员人生 网站导航

java语言实现创建型设计模式―创建者模式

栏目:框架设计时间:2015-06-06 08:17:24

1、描写

创建者模式单独利用1个创建者类来创建对象并组建对象之间的关系,以简化客户端调用的复杂性。相对抽象方法模式来讲,创建者模式增加了1个单独的用于组装对象和对象之间关系的创建者类,由该类来负责对象的组装,以此来更加清晰地划分各个类的职责。

创建者模式将1个复杂对象的构建和它的表示分离,使得一样的构建进程可以创建不同的表示,而且对客户端屏蔽了对象的构建细节,该模式主要由5个部份组成:组装类、抽象创建者类,实现了抽象创建者类的具体创建者类,抽象产品类、实现了抽象产品类的具体产品类。在此可以看出与抽象方法模式相比多了1个组装类。


2、创建者模式的优缺点

优点:在创建者模式中客户端不再负责对象的创建和组装,而是由1个具体的组装类来完成这项功能,将组装的责任交给组装类,客户端只负责对象的调用,从而更加明确了各个类的职责。

缺点:利用创建者模式可以创建出不同类型的产品,但是如果要创建的产品差异非常大就需要编写多个创建者类来实现,这无疑增加了代码的复杂性,而且创建者类只是在构造相干部件的发杂关系上有优势,如果要增加1个部件还是需要改变原本的代码,增加新的模块。


3、源代码

总述:1个公司有计算薪金和社保需求,我们有多个分公司,每一个分公司都要计算这两项,现在我们需要创建分公司对象,利用各个对象调用各个公司计算这两项业务的方法来得出结果,我需要以下几个类:抽象工厂类(定义创建对象的接口),两个子公司的具体工厂类(实现了抽象工厂类中创建对象的方法来产生具体的对象),抽象薪资类(定义薪资计算的标准接口),两个子公司的具体薪资类(实现抽象薪资类中计算薪资的方法),抽象社保类(定义社保计算的标准接口),两个子公司的具体社保类(实现抽象社保类中计算社保的方法),组装类(负责对象的创建和兑现直接关系的组装),客户端调用类(用来调用组装类组装对象并调用相应的实现类方法)。

1、抽象工厂类

package tong.day5_1.builder; /** *抽象的工厂接口,在这个接口中定义了1个两个抽象方法,分别创建薪资类对象和社保类对象,由实现该接口的具体类重写该方法,分别创建自己类的对象 * @author tong * */ public interface AbstractFactory { //抽象方法,用于创建各种类的对象 public abstract Salary createSalary(); public abstract Insurance createInsurance(); }
2、具体工厂类
package tong.day5_1.builder; public class GuangdongFactory implements AbstractFactory { @Override public Salary createSalary() { return new GuangdongSalary(); } @Override public Insurance createInsurance() { return new GuangdongInsurance(); } }
package tong.day5_1.builder; /** * 具体工厂类实现抽象工厂中的所有方法,并返回该类的薪资对象和社保对象 * @author tong * */ public class ZhejiangFactory implements AbstractFactory { @Override public Salary createSalary() { return new ZhejiangSalary(); } @Override public Insurance createInsurance() { return new ZhejiangInsurance(); } }

3、抽象薪资类

package tong.day5_1.builder; /** * 定义1个薪资接口,所有公司的具体薪资计算都实现这个接口,并重写计算薪资的方法computeSalary() * @author tong * */ public interface Salary { public void computeSalary(); }
4、具体薪资类

package tong.day5_1.builder; /** * 广东分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author tong * */ public class GuangdongSalary implements Salary { @Override public void computeSalary() { System.out.println("广东分公司薪资计算"); } }
package tong.day5_1.builder; /** * 浙江分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author tong * */ public class ZhejiangSalary implements Salary { @Override public void computeSalary() { System.out.println("浙江分公司薪资计算"); } }
5、抽象社保类
package tong.day5_1.builder; /** * 抽象社保类 * @author tong * */ public interface Insurance { public abstract void computeInsurance(); }
6、具体社保类

package tong.day5_1.builder; public class GuangdongInsurance implements Insurance { @Override public void computeInsurance() { System.out.println("广东分公司社会保险计算"); } }
package tong.day5_1.builder; public class ZhejiangInsurance implements Insurance { @Override public void computeInsurance() { System.out.println("浙江分公司社会保险计算"); } }
6、组装类

package tong.day5_1.builder; /** * 这里使用1个组装类来简化客户端创建对象、初始化对象和构建对象之间的关系 * @author tong * */ public class Builder { private AbstractFactory abstractFactory; //根据传入的参数肯定初始化哪一个公司的工厂类对象,这里使用多态,根据传入的参数动态创建相应的对象 public Builder(AbstractFactory abstractFactory) { this.abstractFactory = abstractFactory; } //组装的具体实现方法,调用类中计算薪金和社保的方法 public void moneySum() { Salary salary = abstractFactory.createSalary(); salary.computeSalary(); Insurance insurance = abstractFactory.createInsurance(); insurance.computeInsurance(); } }
7、客户端调用类

package tong.day5_1.builder; /** * 客户端在这里得到了简化,不用再斟酌如何组装创建和组装对象,而只需要调用专门的组装类来组装对象 * @author tong * */ public class Client { public static void main(String[] args) { //组装浙江分公司的对象 Builder builder = new Builder(new ZhejiangFactory()); builder.moneySum(); System.out.println("--------------"); //组装广东分公司的对象 builder = new Builder(new GuangdongFactory()); builder.moneySum(); } }

4、运行结果

创建者模式




------分隔线----------------------------
------分隔线----------------------------

最新技术推荐