`
linpyi
  • 浏览: 63058 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工厂模式--简单工厂模式

阅读更多

工厂模式看了几天了,以前曾经有看过,不过没去细看,只是简单的返回一些对象,没考虑到底使用的是哪种对象,这几天翻了一

 

些资料,给搞晕了,好在今天翻到一个高手的BLOG,渐渐的清楚了,以下是引用的一些重点段落

 

 

1.1 简单工厂(Simple Factory)模式


简单工厂模式是类的创建,又叫静态工厂方法(Static Factory Methord)模式。简单工厂模式是由一个工厂对象决定创造哪一种产品类的实例。
 
1.1.1 工厂模式的几种形态

工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态的决定将哪一个类实例化,工厂模式有以下几种形态:
 简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Methord)模式。
 工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。
 抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。

1.1.2 简单工厂模式的引进(一般模式)
比如有一个农场,生产各种水果,有苹果(Apple)、草莓(Strawberry)、葡萄(Grape);农场的园丁(FruitGardener)要根据客户的需求,提供相应的水果。下面看看是如何用简单工厂模式实现这个过程的,如下图:
1.1.2.1 产品接口-水果接口:Fruit.java
package factory.briefnessfactory;

public interface Fruit {
    /**
     * 种植
     */
    void plant();
    /**
     * 生长
     */
    void grow();
    /**
     * 收获
     */
    void harvest();
}	
 1.1.2.2 产品-平果类:Apple.java

package factory.briefnessfactory;

public class Apple implements Fruit {
    private int treeAge;
    /**
     * 种植
     */
    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 返回树龄
     */
    public int getTreeAge() {
        return treeAge;
    }
    /**
     * 设置树龄
     */
    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }
}

 1.1.2.3 产品-草莓类:Strawberry.java
package factory.briefnessfactory;

public class Strawberry implements Fruit {
    /**
     * 生长
     */
    public void grow() {
        System.out.println("Strawberry is growing...");
    }
    /**
     * 收获
     */
    public void harvest() {
        System.out.println("Strawberry has been harvested.");
    }
    /**
     * 种植
     */
    public void plant() {
        System.out.println("Strawberry has been planted.");
    }
    /**
     * 辅助方法
     */
    public static void log(String msg) {
        System.out.println(msg);
    }
}
 
1.1.2.4 产品-葡萄类:Grape.java
package factory.briefnessfactory;

public class Grape implements Fruit {
    private boolean seedless;   //是否有籽
    /**
     * 种植
     */
    public void plant() {
        System.out.println("Grape has been planted.");
    }
    /**
     * 生长
     */
    public void grow() {
        System.out.println("Grape is growing...");
    }
    /**
     * 收获
     */
    public void harvest() {
        System.out.println("Grape has been harvested.");
    }
    /**
     * @return 是否有籽
     */
    public boolean getSeedless() {
        return seedless;
    }
    /**
     * 有无籽的赋值方法
     */
    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
    /**
     * 辅助方法
     */
    public static void log(String msg) {
        System.out.println(msg);
    }
}
 
1.1.2.5 工厂-园丁类:FruitGardener.java
package factory.briefnessfactory;

public class FruitGardener {
    /**
     * 静态工厂方法
     * @param which :具体的产品名称
     * @return 一个水果对象
     * @throws BadFruitException
     */
    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");
        }
    }
}
 

1.1.2.6 工厂异常定义类:BadFruitException.java

package factory.briefnessfactory;

public class BadFruitException extends Exception {
    public BadFruitException(String msg) {
        super(msg);     //调用父类的构造方法
    }
}
 

1.1.2.7 一般工厂模式的测试类

package factory.briefnessfactory;

public class TestApp {
    /**
     * 测试方法
     */
    private void test(String fruitName) {
        try {
            Fruit f = FruitGardener.factory(fruitName);
            System.out.println("恭喜!生产了一个水果对象:" + fruitName);
        } catch (BadFruitException e) {
            System.out.println("对不起!工厂目前不能生产你所要的产品:" + fruitName);
            System.out.println(e.getMessage());     //输出异常信息
            e.printStackTrace();                    //输出异常堆栈信息
        }
    }
    /**
     * 应用入口方法
     */
    public static void main(String args[]) {
        TestApp t = new TestApp();
        t.test("apple");
        t.test("grape");
        t.test("strawberry");
        t.test("car");  //此处会抛异常,水果工厂能生产car(轿车)吗!哈哈哈哈...
    }
}

 

1.1.2.8 测试运行结果

恭喜!生产了一个水果对象:apple
恭喜!生产了一个水果对象:grape
恭喜!生产了一个水果对象:strawberry
对不起!工厂目前不能生产你所要的产品:car
Bad fruit request
factory.briefnessfactory.BadFruitException: Bad fruit request
	at factory.briefnessfactory.FruitGardener.factory(FruitGardener.java:18)
	at factory.briefnessfactory.TestApp.test(TestApp.java:9)
	at factory.briefnessfactory.TestApp.main(TestApp.java:25)

 

1.1.3 简单工厂模式的一般性结构

 
总结一下,从上面的简单工厂模式的实现可以看到,简单工厂模式需要实现
 工厂角色:园丁
 抽象产品:水果接口
 具体产品:苹果、葡萄、草莓
另外还一般还需要实现
 工厂异常类
 客户类

1.1.4 简单工厂模式的实现

 
1.1.4.1 使用接口或者抽象类实现多层次的产品结构
工厂类可以有多个静态的工厂方法,分别用来生产不同的产品对象。
 
1.1.4.2 多个工厂方法
分别负责创建不同的产品对象,比如java.text.DateFormat类是其子类的工厂类,而DateFormat类就是提供了多个静态工厂方法。
 
1.1.4.3 抽象产品角色的省略
如果系统仅有一个具体产品角色产品角色的话,那么就可以省略掉抽象产品角色。省略掉抽象产品角色后的简略类

本来想自己写,不过实在想不出有比这篇更具有说服力的了

其实还有一些东西没有贴出来,由于太多了,分开写,
来自:http://lavasoft.blog.51cto.com/62575/11345 大家可以自己去看看

分享到:
评论

相关推荐

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    【熵增学院VIP精品课程录播】简单工厂模式-工厂方法模式-抽象工厂模式

    熵增教育-熵增学院VIP精品课程录播:简单工厂模式-工厂方法模式-抽象工厂模式

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    工厂模式-反射模式-登陆-查询-实例-简单分页

    本文将深入探讨“工厂模式”、“反射模式”,并结合“登陆”、“查询”及“简单分页”的应用场景,帮助你理解如何在实际项目中运用这些技术。 首先,让我们来看“工厂模式”。工厂模式是一种创建型设计模式,它提供...

    抽象工厂模式--演示代码

    抽象工厂模式是设计模式中的一种,属于创建型模式。它提供了一个创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“家族”这个概念,即一系列相关的对象,它们可以相互协作以完成特定任务。在Java中,...

    简单工厂模式-计算器

    简单工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个专门的类(称为工厂类)负责创建对象,客户端通过调用工厂类的特定方法来获取所需对象,而无需了解具体创建过程或...

    设计模式-简单工厂模式-例题

    ### 设计模式——简单工厂模式解析与应用实例 #### 一、简单工厂模式概述 简单工厂模式(Simple Factory Pattern)是一种常用的创建型设计模式。它提供了一种方式来封装对象的创建过程,使得整个系统更加灵活,...

    工厂模式-设计模式

    1. **简单工厂模式**:也称为静态工厂模式,它通常包含一个静态方法,该方法根据输入参数返回相应的产品对象。这种方法简单易用,但不支持工厂类的扩展,且违反了"开闭原则"。 2. **工厂方法模式**:定义一个用于...

    java工厂模式-简单工厂模式

    ### Java工厂模式—简单工厂模式 #### 一、引言 简单工厂模式并不是GoF设计模式之一,但它作为设计模式的基础,在实际项目中被广泛使用。简单工厂模式的主要目的是将对象的创建与对象的使用分离,使代码更加灵活,...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    JAVA设计模式例程-工厂模式-1

    此外,还可以进一步研究简单工厂、工厂方法和抽象工厂这三种不同类型的工厂模式,了解它们之间的区别和适用场景。设计模式的学习对于提升软件设计能力至关重要,希望这个例子能帮助你在理解工厂模式的道路上更进一步...

    工厂模式-简单工厂(设计模式的入门级模式)

    简单工厂模式作为设计模式的入门级模式,适合初级学习者理解和实践。在简单工厂模式中,一个工厂类负责创建对象,而客户端代码则不再直接创建对象,而是通过调用工厂类的静态方法来获取所需的实例。 在Java中,我们...

    工厂模式 - PHP版

    1. **简单工厂模式**:由一个静态方法或单一工厂类负责创建所有类型的产品,当产品类型增加时,可能需要修改工厂类,违背了开闭原则。 2. **工厂方法模式**:定义一个创建对象的接口,让子类决定实例化哪一个类。...

    模式之一工厂模式-------------------------

    工厂模式通常分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式**:这是最基础的工厂模式形式,它包含一个静态工厂方法,用于创建对象。简单工厂模式适用于产品种类较少且不经常变动的...

    简单工厂模式-策略模式-反射源码下载

    简单工厂模式、策略模式以及反射是Java编程中非常重要的概念,它们都是软件设计模式和语言特性的典型应用,对于理解和构建高效、可扩展的代码至关重要。 简单工厂模式是一种创建型设计模式,它提供一个工厂方法,...

    设计模式-简单工厂模式-披萨店C#语言版

    简单工厂模式是软件设计模式中的一种,它属于创建型模式,旨在提供一个统一的接口,用来创建一组相关或相互依赖的对象。在这个例子中,我们关注的是如何使用C#语言实现这个模式,特别是在披萨店的场景下。 在披萨店...

    简单工厂-工厂方法-抽象工厂 对比总结

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    2 工厂模式-课程内容.rar

    工厂模式主要分为简单工厂模式、工厂方法模式和抽象工厂模式。 - 简单工厂模式:一个静态工厂类负责创建所有类型的对象,它通常用于创建对象种类较少的情况。 - 工厂方法模式:将具体的对象创建过程交给子类处理,...

    游戏设计4-工厂模式-锻造武器

    游戏设计中的工厂模式是一种常用的软件设计模式,它在游戏开发中尤其重要,因为游戏往往涉及到大量对象的创建和管理。在这个“游戏设计4-工厂模式-锻造武器”的主题中,我们将深入探讨工厂模式如何应用于游戏中的...

Global site tag (gtag.js) - Google Analytics