现在的位置: 首页 > 综合 > 正文

java设计模式1:simplefactory

2017年12月07日 ⁄ 综合 ⁄ 共 3516字 ⁄ 字号 评论关闭

PH`Y3AU]7FRXZ6GY{%BP$0S

simplefactory比较简单,即是根据不同的条件,创建不同的产品,这些产品有一个共同的基类,封装了相同的行为,上例中这些水果都有三种功能,并在基类中进行了封装。

相关代码:

package com.javapatterns.simplefactory;

/**
* 水果类,接口
* @author luhx
*/
public interface Fruit
{   
    /**
     * 栽种
     */
    void plant();
    /**
     * 成长
     */
    void grow();

    /**
     * 收割
     */
    void harvest();

}

 

 

package com.javapatterns.simplefactory;

/**
* 苹果类,继承于Fruit
* @author luhx
*
*/
public class Apple implements Fruit
{
    public void plant()
    {
        System.out.println("Apple has been planted.");
    }

    public void grow()
    {
        System.out.println("Apple is growing...");
    }

    public void harvest()
    {
        System.out.println("Apple has been harvested.");
    }

    /**
     * 取树龄
     * @return  :int
     * @uml.property  name="treeAge"
     */
    public int getTreeAge(){ return treeAge; }

    /**
     * 设树龄
     * @param  treeAge:int
     * @uml.property  name="treeAge"
     */
    public void setTreeAge(int treeAge){ this.treeAge = treeAge; }

    /**
     * 树年龄
     * @uml.property  name="treeAge"
     */
    private int treeAge;
}

 

 

package com.javapatterns.simplefactory;

/**
* 葡萄类,继承于Fruit
* @author luhx
*
*/
public class Grape implements Fruit
{
    public void grow()
    {
        System.out.println("Grape is growing...");
    }

    public void harvest()
    {
        System.out.println("Grape has been harvested.");
    }

    public void plant()
    {
        System.out.println("Grape has been planted.");
    }

    /**
     * 判断是否有籽
     * @return:boolean
     */
    public boolean getSeedless()
    {
        return seedless;
    }

    /**
     * 设置是否有籽标识
     * @param  seedless:boolean
     * @uml.property  name="seedless"
     */
    public void setSeedless(boolean seedless)
    {
        this.seedless = seedless;
    }

    /**
     * 是否有籽
     * @uml.property  name="seedless"
     */
    private boolean seedless;
}

 

package com.javapatterns.simplefactory;
/**
* 水果园艺工人类,creater
* @author luhx
*
*/
public class FruitGardener
{
    public static Fruit factory(String which) throws BadFruitException
    {
        if (which.equalsIgnoreCase("apple"))
        {
            return new Apple();
        }
        else if (which.equalsIgnoreCase("strawberry"))
        {
            return new Strawberry();
        }
        else if (which.equalsIgnoreCase("grape"))
        {
            return new Grape();
        }
        else
        {
             throw new BadFruitException("Bad fruit request");
        }
    }
}

 

package com.javapatterns.simplefactory;
/**
* 水果园艺工人类,creater
* @author luhx
*
*/
public class FruitGardener
{
    public static Fruit factory(String which) throws BadFruitException
    {
        if (which.equalsIgnoreCase("apple"))
        {
            return new Apple();
        }
        else if (which.equalsIgnoreCase("strawberry"))
        {
            return new Strawberry();
        }
        else if (which.equalsIgnoreCase("grape"))
        {
            return new Grape();
        }
        else
        {
             throw new BadFruitException("Bad fruit request");
        }
    }
}

 

package com.javapatterns.simplefactory;

/**
* 水果异常类
* @author luhx
*
*/
public class BadFruitException extends Exception
{
    public BadFruitException(String msg)
    {
        super(msg);
    }
}

 

 

W0$[P}~W0@FH)[X]@KP2G0F

总结:简单工厂模式涉及到工厂角色,抽象产品角色以及具体产品角色等三个角色。

1、工厂类(Creator):担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的Java类实现。
2、抽象产品(Product):担任这个角色的类是由工厂实方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽角类实现。
3、具体产品(Concrete Product):工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。

 

package com.javapatterns.simplefactory;

public interface Product
{
}

package com.javapatterns.simplefactory;

public class ConcreteProduct implements Product
{
    public ConcreteProduct(){}
}

 

package com.javapatterns.simplefactory;

public class Creator
{
    public static Product factory()
    {
        return new ConcreteProduct();
    }

    /** @link dependency
     * @label Creates*/
    /*# ConcreteProduct lnkConcreteProduct; */
}

抱歉!评论已关闭.