在上一篇策略模式的基础上进一步优化,引出简单工厂模式。
按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);
}
}
分享到:
相关推荐
java设计模式--工厂模式 HeadFirst 书中的源代码
java设计模式----抽象工厂模式,简单工厂模式代码 代码内部
java设计模式-创建者模式-简单工厂模式。详细的讲解了什么是简单工长模式及应用场景和应用场景的代码事例。
java设计模式-创建者模式-简单工厂模式。详细的讲解了什么是抽象工厂模式及应用场景和应用场景的代码事例。及各工厂模式的区别。
JAVA-设计模式-创建型模式-工厂模式
java设计模式-创建者模式-简单工厂模式。详细的讲解了什么是工厂方法模式及应用场景和应用场景的代码事例。及各工厂模式的区别。
设计模式--工厂模式java例子
Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel - 详情:https://blog.csdn.net/Dream_Weave/article/details/83989879
简单工厂模式示例 有注释 需要的朋友可以下载研究 很简单很基础的一个设计模式
Java设计模式,简单工厂的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
java,设计模式中的一种,工厂设计模式。
java常用设计模式-工厂模式
java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...
java,设计模式中的一种,抽象工厂设计模式。
JAVA设计模式例程-工厂模式-的例程,看完以后基本上能对JAVA上实现简单工厂能有所了解,简单工厂还是比较容易滴,而且也是较为常用的一种设计模式。
java常用设计模式-抽象工厂模式
Java设计模式,抽象工厂的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...
JAVA设计模式例程-工厂模式,一个实例,正在学习设计模式的朋友可看一下,看完了后应该对工厂模式有所了解了。
Java设计模式,工厂方法的Demo,具体的思想有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂