在上一篇策略模式的基础上进一步优化,引出简单工厂模式。
按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设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
java设计模式----抽象工厂模式,简单工厂模式代码 代码内部
Java设计模式中的工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式的核心思想是将对象的创建过程封装起来,使得创建过程独立于使用过程,从而提高了代码的可扩展性和可维护性。在HeadFirst...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
简单工厂模式是面向对象设计中的一种经典设计模式,它属于创建型模式,主要用来解决对象的创建问题。在Java编程中,简单工厂模式通过一个中心工厂类来负责创建相关的对象,而无需让客户端代码直接new具体的产品类。...
JAVA-设计模式-创建型模式-工厂模式
Java设计模式中的工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个工厂对象来完成创建工作。这种模式的核心在于封装了对象...
Java设计模式是软件开发中的重要概念,它们是解决常见编程问题的经验总结,为代码组织提供了标准的结构和模式。工厂模式作为最常用的设计模式之一,是创建型模式的代表,它的主要目标是提供一个创建对象的接口,但让...
java设计模式-创建者模式-简单工厂模式。详细的讲解了什么是工厂方法模式及应用场景和应用场景的代码事例。及各工厂模式的区别。
Java设计模式是软件工程中的一种重要思想,它总结了在解决特定问题时,程序员们反复使用的一些最佳实践和解决方案。这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者...
**Java设计模式——简单工厂** 简单工厂模式是软件设计模式中的一种基础模式,它属于创建型设计模式。在Java编程中,我们常常会遇到需要创建一系列相关或相互依赖的对象,而这些对象的创建过程可能会非常复杂。这时...
简单工厂模式是Java设计模式中创建型模式的一种,也被称为静态工厂方法模式。该模式的主要思想是由一个专门的工厂类来负责创建其他类的实例。简单工厂模式通过封装创建对象的过程,使得调用者无需关心对象的具体创建...
Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel - 详情:https://blog.csdn.net/Dream_Weave/article/details/83989879
Java设计模式-建造者模式详解 Java设计模式-建造者模式详解将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。...
Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...
下面是一个简单的Java抽象工厂模式的示例: ```java // 抽象工厂接口 public interface WidgetFactory { Button createButton(); Label createLabel(); } // Windows具体工厂 public class WinWidgetFactory ...
java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...
简单工厂模式则是创建型设计模式的另一种,它提供一个创建对象的接口,但是让子类决定实例化哪一个类。它负责创建所有可能的类的实例,一般被用来创建某一类产品。 在上述组装电脑的场景下,简单工厂模式可以帮助...
### Java设计模式详解 #### 1. 设计模式概述 设计模式是在软件设计过程中针对常见问题的可重复使用的解决方案。这些模式有助于解决软件设计中出现的常见问题,并提供了一种标准化的方法来解决问题,使得代码更加...
**Java设计模式——抽象工厂** 在软件工程中,设计模式是一种在特定场景下解决常见问题的模板或蓝图。抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这...