在上一篇策略模式的基础上进一步优化,引出简单工厂模式。
按Object数组中Person的某一属性进行排序,按哪个属性排序的功能抽象为接口,具体由对应策略实现类完成。
这一篇主要是把调用相应策略时改为工厂模式调用,来演示工厂模式的使用。
Person类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午14:12 * 待排序类实现了Comparable接口 * 排序条件由具体策略决定,排序策略实现了Comparator接口 */ public class Person implements Comparable<Person>{ private String name;//姓名 1 private int age;//年龄 2 private int height;//身高 3 //请关注工厂模式博文,此处会换成工厂方法实现 //private Comparator comparator = new PersonAgeComparator();//按年龄排序 //private Comparator comparator = new PersonHeigthComparator();//按身高排序 // private Comparator comparator = new PersonNameComparator();//按姓名排序 //请关注工厂模式博文,此处会换成工厂方法实现 //工厂方法形式实现 //1,按名称排序策略;2,按年龄排序策略;3,按身高排序策略; private Comparator comparator = PersonComparatorContext.getComparatorInstance(1); public Person(String name, int age,int height) { this.name = name; this.age = age; this.height = height; } public Person(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } @Override /** * 实现Comparable接口中的comparaTo方法 * 具体排序条件由对应策略实现 */ public int compareTo(Person o) { return comparator.compare(this,o);//根据什么排序,由具体策略实现决定 } }
按姓名进行排序的策略,PersonNameComparator类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午4:05 * To change this template use File | Settings | File Templates. */ public class PersonNameComparator implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return o1.getName().compareToIgnoreCase(o2.getName());//按姓名排序 } }
获取按姓名排序策略的工厂,PersonNameComparatorFactory类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-13 * Time: 上午12:21 * To change this template use File | Settings | File Templates. */ public class PersonNameComparatorFacory extends AbstractPersonComparatorFactory { @Override public Comparator getComparatorInstance() { return new PersonNameComparator(); } }
按年龄排序的策略,PersonAgeComparator类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午4:07 * 按人的年龄进行比较的策略 */ public class PersonAgeComparator implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return o1.getAge()-o2.getAge();//按年龄比较 } }
获取按年龄排序策略的工厂,PersonAgeComparatorFactory类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午10:44 * To change this template use File | Settings | File Templates. */ public class PersonAgeComparatorFactory extends AbstractPersonComparatorFactory { @Override public Comparator getComparatorInstance() { return new PersonAgeComparator(); } }
按身高排序的策略,PersonHeightComparator类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午4:13 * 按人的高度进行比较的策略 */ public class PersonHeightComparator implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return o1.getHeight()-o2.getHeight();//按高度比较 } }
获取按身高排序策略的工厂,PersonHeightComparatorFactory类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-13 * Time: 上午12:19 * To change this template use File | Settings | File Templates. */ public class PersonHeightComparatorFactory extends AbstractPersonComparatorFactory { @Override public Comparator getComparatorInstance() { return new PersonHeightComparator(); } }
获取排序策略的工厂的抽象类(注意:这里不是抽象工厂的概念),AbstractPersonComparatorFactory类:
package com.flg.Strategy; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午4:25 * 获取排序策略的工厂的抽象类 */ public abstract class AbstractPersonComparatorFactory { public abstract Comparator getComparatorInstance(); }
根据类型获取排序策略的Context,PersonComparatorContext类:
package com.flg.Strategy; import java.util.Comparator; import java.util.HashMap; import java.util.Map; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-13 * Time: 上午12:45 * 根据类型获取排序策略的Context */ public class PersonComparatorContext { private static Map<Integer,Comparator> context = new HashMap<Integer,Comparator>(); private PersonComparatorContext(){} public static Comparator getComparatorInstance(int type) { if(context.get(type)==null){ context.put(type,getComparator(type)); } return context.get(type); } private static Comparator getComparator(int type){ AbstractPersonComparatorFactory factory = null; switch (type){ case 1: factory = new PersonNameComparatorFacory();break; case 2: factory = new PersonAgeComparatorFactory();break; case 3: factory = new PersonHeightComparatorFactory();break; //默认按名字排序 default: factory = new PersonNameComparatorFacory();break; } Comparator comparator = factory.getComparatorInstance(); return comparator; } }
测试类,Test类:
package com.flg.Strategy; import com.flg.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created with IntelliJ IDEA. * User: fuliguo * Date: 12-8-12 * Time: 下午5:07 * To change this template use File | Settings | File Templates. */ public class Test { public Object[] getObjects() { Object [] objects = new Object[]{ new Person("张三",22,188), new Person("赵六",19,210), new Person("王五",30,175), new Person("李四",10,158) } ; return objects; } /** * 控制台输出遍历list对像顺序 */ public void printObjects(Object[] objects) { Person p; for(int i=0;i<objects.length;i++){ p = (Person) objects[i]; System.out.println(p.getName()+"---"+p.getAge()+"---"+p.getHeight()); } } public static void main(String [] arg){ Test t = new Test(); Object [] objects = t.getObjects(); t.printObjects(objects); Arrays.sort(objects); System.out.println("***********排序后******************"); t.printObjects(objects); } }