程序员人生 网站导航

java语言实现创建型模式―简单工厂模式

栏目:框架设计时间:2015-05-25 08:57:32

1、描写

简单工厂模式又名静态工厂方法模式,是所有工厂模式中最简单的1个,它定义1个具体的工厂类来负责创建所有类的对象并初始化创建的对象,它主要由3部份组成:工厂类、抽象类、实现抽象类的具体类,然后通过客户端调用工厂类创建相应的对象。

注意:简单工厂模式不属于GoF总结的23种设计模式,它是相当于初学java的HelloWorld案例,帮助初学者了解设计模式,增长信心的1个设计模式。


2、简单工厂模式的优缺点

优点:相对直接在客户端创建对象并初始化对象的值来讲,简单工厂模式将创建对象和初始化任务交给了工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。

缺点:只使用1个工厂类来创建各具特点的所有类,当具体产品的种类不断增加,对创建的方式有所改变时就需要对这个工厂类进行不断的改变,增加相应的判断,增加相应的类的创建逻辑,致使工厂类的代码愈来愈庞大,不利于后期的保护。另外,简单工厂模式使用静态方法来创建对象,这样就致使这个创建对象的静态方法不能被继承,只能在这1个类里变得愈来愈臃肿。

总结:虽然简单工厂模式将对象的创建和初始化工作与客户端分离了,实现了责任的分配策略,但是所有对象的创建和初始化工作都集中到了1个具体的工厂类中,如果要创建的对象种类繁多,这个工厂类将非常庞大,不利于后期保护。


3、源代码

1、抽象类

package tong.day4_30.introduce; /** * 定义1个薪资接口,所有公司的具体薪资计算都实现这个接口,并重写计算薪资的方法computeSalary() * @author tong * */ public interface Salary { public void computeSalary(); }
2、具体类
package tong.day4_30.introduce; /** * 广东分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author Administrator * */ public class GuangdongSalary implements Salary { @Override public void computeSalary() { System.out.println("广东分公司薪资计算"); } }

package tong.day4_30.introduce; /** * 河北公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author tong * */ public class HebeiSalary implements Salary{ @Override public void computeSalary() { System.out.println("河北分公司薪资计算"); } }

package tong.day4_30.introduce; /** * 浙江分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author Administrator * */ public class ZhejiangSalary implements Salary { @Override public void computeSalary() { System.out.println("浙江分公司薪资计算"); } }
3、简单工厂类
package tong.day4_30.introduce; /** * 简单工厂类负责所有对象的创建和对象的初始化,这里采取java中的反射机制,根据传入的参数来创建类的对象 * @author tong * */ public class SimpleFactory { //根据参数创建对象,这是1个静态方法可以直接使用类名调用 public static Salary createSalary(String name) { Class<Salary> clazz = null; Salary salary = null; try { //利用反射机制获得该参数对应的类的对象 clazz = (Class<Salary>) Class.forName(name); //使用此类对象创建对应的薪资类对象,这里使用父类指针指向子类对象,实现了多态 salary = (Salary)clazz.newInstance(); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } return salary; } }
4、客户端调用
package tong.day4_30.introduce; /** * 在客户端调用工厂类创建薪资的方法,并输出结果; * 如果还想创建更多的公司薪资,那末就创建1个相应的类,在Client对象中传入相应的参数创建相应的对象便可 * @author tong * */ public class Client { public static void main(String[] args) { //创建Client对象,以此对象调用computeSalary()方法传入要类型参数 new Client().computeSalary("tong.day4_30.introduce.HebeiSalary"); new Client().computeSalary("tong.day4_30.introduce.ZhejiangSalary"); new Client().computeSalary("tong.day4_30.introduce.GuangdongSalary"); } /** * 根据传入的参数调用工厂类的创建薪资方法,创建不同的薪资对象 * @param name */ public void computeSalary(String name) { //这里使用多态,根据传入参数的不同,生成ZhejiangSalary或HebeiSalary对象 Salary salary = SimpleFactory.createSalary(name); //使用生成的对象动态调用具体类对象的方法 salary.computeSalary(); } }

4、运行结果

简单工厂模式

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

最新技术推荐