`

JAVA设计模式---简单工厂模式

 
阅读更多

在上一篇策略模式的基础上进一步优化,引出简单工厂模式。

按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);

    }


}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics