本文的内容概要
* 开发环境及其文件目录概述
* 项目源码及其注释解析
* 工厂方法类图及其类的职责介绍
* 软件设计中为什么要使用工厂方法,其优缺点及适用环境
* 核心内容总结
下面就一一介绍,我们以一个农民种植生产水果为例来简述工厂方法的各个特征。
1: 首先是,实验环境极其类文件结构
2: 类文件内容及其解析:
package com.macower.pattern.simplefactory;
/**
@author Macower
* @since 2009-12-2
* Apple类描述的是一种叫做苹果的水果,实现了Fruit 接口,因为作为一种水果其必然具有水果的一般特征。
*
*/
public class Apple implements Fruit {
/**
* 苹果树的年龄
*/
private int treeAge;
/**
* 生长
*/
@Override
public void grow() {
System.out.println("苹果在生长!");
}
/**
* 收获
*/
@Override
public void harvest() {
System.out.println("收获苹果!");
}
/**
* 种植
*/
@Override
public void plant() {
System.out.println("种植苹果!");
}
public int getTreeAge() {
return treeAge;
}
}
----------------------------------------------------------------------------------------------------------------------
package com.macower.pattern.simplefactory;
/**
*
* @author Macower
* @since 2009-12-2
* Fruit类是工厂类的一个一个接口,中间描述了水果的基本特点
* 是其他真正的水果抽取的一个接口
*
*/
public interface Fruit {
public void grow();//生长
public void harvest();//收获
public void plant();//种植
}
----------------------------------------------------------------------------------------------------------------------
package com.macower.pattern.simplefactory;
/**
*
* @author Macower
* @since 2009-12-2
* Grape类描述的是一种叫做葡萄的水果,实现了Fruit 接口 因为作为一种水果其必然具有水果的一般特征。
*
*/
public class Grape implements Fruit {
/**
* 判定葡萄是否有籽
*/
private boolean seedless;
/**
* 生长
*/
@Override
public void grow() {
System.out.println("葡萄在生长!");
}
/**
* 收获
*/
@Override
public void harvest() {
System.out.println("收获葡萄!");
}
/**
* 种植
*/
@Override
public void plant() {
System.out.println("种植葡萄!");
}
public boolean isSeedless() {
return seedless;
}
}
----------------------------------------------------------------------------------------------------------------------
package com.macower.pattern.simplefactory;
/**
* 苹果种植专业户
* @author Macower
*
*/
public class ApplePeasant implements Peasant{
@Override
public Fruit factory(){
return new Apple();
}
}
----------------------------------------------------------------------------------------------------------------------
package com.macower.pattern.simplefactory;
/**
* 葡萄种植专业户
* @author Macower
*
*/
public class GrapePeasant implements Peasant{
@Override
public Fruit factory(){
return new Grape();
}
}
----------------------------------------------------------------------------------------------------------------------
package com.macower.pattern.simplefactory;
/**
*
* @author Macower
* @since 2009-12-2
* Peasant是一个工厂类叫做果农类,此时定义为一个抽象的类,他可以决定什么时候种植什么样的作物,这个类就是模拟简单的工厂的工厂类
*
*
*/
public interface Peasant {
/**
* 返生产水果
*
* @param fruit
*/
public Fruit factory();
}
----------------------------------------------------------------------------------------------------------------------
package com.macower.pattern.simplefactory;
public class Client {
/**
* @param args
*/
public static void main(String[] args){
Peasant peasant1 = new ApplePeasant();
Fruit fruit1 = peasant1.factory();
showLife(fruit1);
System.out.println("-----------------------------");
Peasant peasant2 = new GrapePeasant();
Fruit fruit2 = peasant2.factory();
showLife(fruit2);
System.out.println("------------------showLife(peasant1)-----------");
showLife(peasant1);
System.out.println("------------------showLife(peasant2)-----------");
showLife(peasant2);
}
/**
* 展示水果生产的生命周期,传入抽象的Fruit接口,减低了与具体的类的耦合,同时运用多态的特性也提高了方法和类的可重用和可维护性。
* @param fruit
*/
public static void showLife(Fruit fruit) {
fruit.plant();
fruit.grow();
fruit.harvest();
}
/**
* 此时方法是showLife(Fruit fruit)的多态的,只需要将工厂传入就可以自动进行生产,将细节进一步封装,从而进一步减少了耦合。
* @param peasant
*/
public static void showLife(Peasant peasant){
Fruit fruit = peasant.factory();
showLife(fruit);
}
}
----------------------------------------------------------------------------------------------------------------------
3: 简单工厂类图及其类的职责介绍
本示例工厂方法类图
* 工厂方法类图及其类的职责介绍
a. 抽象工厂角色(Creator):担任模式的核心,它是与应用程序无关的。这个角色通常由抽象类或者接口实现。
b. 具体工厂角色(Concrete Creator):与具体的业务逻辑密切相关本示例中是Applepeasant和GrapePeasant。
c. 抽象产品角色(Product):工厂模式创建的超类型。本示例是Fruit
d. 具体的产品角色(ConcreteProduct):具体的产品
* 软件设计中为什么要使用工厂方法,其优缺点及适用环境
* 核心内容总结
工厂的方法的核心是抽象的工厂,工厂方法允许很多具体的工厂类从抽象工厂继承下来,从而实现了简单工厂的综合。
工厂方法模式之所以有一个别名叫做多态性工厂模式,显然是因为具体的工厂都有共同的接口或者是共同的父类。
抽象工厂并不掌握具体的对象的创建,而是把这项权利交给了子类,利用多态的特性进行统一的管理。
在工厂方法当中,只有一个工厂等级结构(抽象工厂与工厂方法的本质区别就是 抽象工厂有多个工厂等级结构)。
在工厂方法返回的应当是抽象的类型,而不是具体的类型,这样才能保证产品的多态性,换言之就是调用工厂的客户端可以针对抽象进行编程,依赖一个抽象的产品类型,而不是具体的产品类型。
假设返回的是具体的类型那么就已经退化了,违反了工厂方法模式的本意。
在工厂对象应当有一个抽象的超类型,换而言之应当有数个具体的工厂类作为抽象超类型的具体子类存在于工厂的等级结构中。当抽象的工厂被省略的时候就发生了退化。从而导致工厂多态性的丧失。