`
chendang1314
  • 浏览: 104004 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

几个工厂模式初识

阅读更多
简单工厂模式、工厂方法模式及抽象工厂模式
一、实现方法
简单工厂:
public interface Product
{
}


public interface Fruit
{
    void grow();

    void harvest();

    void plant();
}

package com.javapatterns.simplefactory;

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.");
    }

    public boolean getSeedless()
    {
        return seedless;
    }

    public void setSeedless(boolean seedless)
    {
        this.seedless = seedless;
    }

    private boolean seedless;
}

package com.javapatterns.simplefactory;

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.");
    }

}

package com.javapatterns.simplefactory;

public class Apple implements Fruit
{

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

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

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

    public int getTreeAge(){ return treeAge; }

    public void setTreeAge(int treeAge){ this.treeAge = treeAge; }

    private int treeAge;
}

package com.javapatterns.simplefactory;

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.factorymethod.farm;

public interface Fruit
{
    void grow();

    void harvest();

    void plant();
}
package com.javapatterns.factorymethod.farm;

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.");
    }

    public boolean getSeedless()
    {
        return seedless;
    }

    public void setSeedless(boolean seedless)
    {
        this.seedless = seedless;
    }

    private boolean seedless;
}

package com.javapatterns.factorymethod.farm;

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.");
    }

}

package com.javapatterns.factorymethod.farm;

public class Apple implements Fruit
{
    private int treeAge;

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

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

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

    public int getTreeAge()
    {
        return treeAge;
    }

    public void setTreeAge(int treeAge)
    {
        this.treeAge = treeAge;
    }

}

package com.javapatterns.factorymethod.farm;

public interface FruitGardener
{
    public Fruit factory();

    /** @link dependency 
     * @label Creates*/
    /*# Fruit lnkFruit; */
}

package com.javapatterns.factorymethod.farm;
                                                         
public class StrawberryGardener implements FruitGardener 
{
    public Fruit factory()
    {
        return new Apple();
    }
}

package com.javapatterns.factorymethod.farm;
                                                         
public class GrapeGardener implements FruitGardener 
{
    public Fruit factory()
    {
        return new Apple();
    }
}

package com.javapatterns.factorymethod.farm;
                                                         
public class AppleGardener implements FruitGardener 
{
    public Fruit factory()
    {
        return new Apple();
    }
}

如果说现在又要新增一个产品族与Fruit等级的产品此时会新增n多的工厂于是引入抽象工厂
抽象工厂
package com.javapatterns.abstractfactory;

public interface ProductA
{
}

package com.javapatterns.abstractfactory;

public class ProductA1 implements ProductA
{
    public ProductA1()
    {
    }
}

package com.javapatterns.abstractfactory;

public class ProductA2 implements ProductA
{
    public ProductA2()
    {
    }
}

package com.javapatterns.abstractfactory;

public interface ProductB
{
}

package com.javapatterns.abstractfactory;

public class ProductB1 implements ProductB
{
    public ProductB1()
    {
    }
}

package com.javapatterns.abstractfactory;

public class ProductB2 implements ProductB
{
    public ProductB2()
    {
    }
}

package com.javapatterns.abstractfactory;

public interface Creator
{
    public ProductA factoryA();

	public ProductB factoryB();
}

package com.javapatterns.abstractfactory;

public class ConcreteCreator1 implements Creator
{
    public ProductA factoryA()
    {
        return new ProductA1();
    }

    public ProductB factoryB()
    {
        return new ProductB1();
    }

    /** @link dependency */
    /*# ProductA1 lnkProductA1; */

    /** @link dependency */
    /*# ProductB1 lnkProductB1; */
}

package com.javapatterns.abstractfactory;

public class ConcreteCreator2 implements Creator
{
    public ProductA factoryA()
    {
        return new ProductA1();
    }

    public ProductB factoryB()
    {
        return new ProductB1();
    }

    /** @link dependency */
    /*# ProductA2 lnkProductA2; */

    /** @link dependency */
    /*# ProductB2 lnkProductB2; */
}

二、三者的联系

以实例图为:






  • 大小: 24.2 KB
  • 大小: 42.1 KB
分享到:
评论

相关推荐

    java设计模式之外观模式.zip

    在Java中,外观模式通常包含以下几个关键角色: 1. **外观(Facade)角色**:它是客户端面对的接口,负责协调各个子系统的工作,为客户端提供简洁的调用接口。 2. **子系统(SubSystem)角色**:这些是实际执行特定...

    初识PLC——PLC工作原理.ppt

    PLC的工作过程可以分为几个主要阶段,这些阶段通常按照特定顺序循环执行: 1. **输入采样阶段**:在这个阶段,PLC读取现场输入设备的状态,如传感器、按钮或开关。这些输入信号被存储在输入映像寄存器中,作为当前...

    AutoCAD 2014室内装潢设计入门视频教程下载第1章 初识AutoCAD2014.zip

    在第1章“初识AutoCAD2014”中,我们将从以下几个核心知识点入手: 1. **界面介绍**:首先,我们会详细介绍AutoCAD 2014的工作界面,包括菜单栏、工具栏、命令行、坐标系统、绘图区等组成部分,以及如何自定义工作...

    初识Spring

    - **单例模式(Singleton)**:默认模式,IoC容器只会创建一个Bean实例,适用于全局共享的对象,如DAO、Service等。 - **多例模式(Prototype)**:每次请求都会创建一个新的Bean实例,适用于需要个性化实例的情况。...

    Java 第一阶段教材.zip

    11. **基本设计模式**:初识设计模式,如单例模式、工厂模式和观察者模式,这些都是软件开发中常用的设计模式,有助于编写可扩展和可维护的代码。 在学习过程中,实践是关键。通过编写简单的程序,逐步加深对这些...

    51单片机汇编语言教程:20课单片机定时、计数器实验.zip

    本教程的20个实验涵盖了以下几个核心知识点: 1. **定时器/计数器的基本概念**:讲解定时器和计数器的工作原理,包括它们在硬件层面的结构和操作模式。 2. **工作模式设置**:介绍如何通过寄存器配置选择不同的...

    基于SSM框架+mysql,采用分布式架构的移动电子商城项目源码.zip

    具体细节需解压后查看,但可以预期的是,源代码文件夹会分为几个主要部分,如前端资源(HTML、CSS、JavaScript)、后端服务(Java或Spring相关文件)、配置文件(如application.properties或yaml文件)、数据库脚本...

    服务器配置与管理.doc

    具体目标则细化为几个方面:初步认识计算机网络、进行网络的物理连接、网络逻辑连接、交换机的配置以及互联网连接。每个目标都与实际工作任务紧密相连,如在物理连接部分,学生需要了解不同的网络传输介质,进行...

    思科九年TXT

    通过以上几个方面的介绍,我们可以看出,在思科工作的九年时间里,主人公不仅实现了个人职业上的成长和发展,也在生活品质和个人能力方面取得了显著的进步。这段经历对于他来说无疑是一段宝贵的人生财富。

    Java学习路径(三)过程篇.txt

    为了更好地利用这些资源,需要对以下几个方面有深入了解: - **`java.lang`包**:提供了语言基础类,如`String`、`Object`、`System`等。 - **`java.io`包**:用于文件输入输出操作,包括流(Stream)和缓冲区...

    STM32库开发实战指南:基于STM32F4.pptx

    - **3.2 STM32能做什么**:通过几个实际应用场景(智能手环、微型四轴飞行器等),展示了STM32的强大功能。 - **3.3 STM32选型**:提供了STM32系列产品的分类、命名规则及如何根据项目需求选择合适的MCU型号的建议。...

    自己动手写操作系统(含源代码).part2

    原因有几个方面。第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解,但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委,但写得太简略,以至于读者看来未必清晰。第二,我自己...

    自己动手写操作系统(含源代码).part1

    原因有几个方面。第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解,但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委,但写得太简略,以至于读者看来未必清晰。第二,我自己...

    HAP框架-定时调度器使用手册.zip

    总的来说,《HAP框架-定时调度器使用手册》是一个全面而深入的指南,无论是对初识HAP框架的开发者,还是寻求优化现有定时任务的资深工程师,都能从中获益良多。通过学习和实践,开发者可以充分利用HAP框架的定时调度...

    JavaScript.docx

    学习JavaScript之前,推荐先掌握以下几个方面的基础知识: - **HTML基础**: 用于构建网页结构。 - **CSS基础**: 用于控制网页样式和布局。 - **基本的编程概念**: 如变量、函数、控制流等,这有助于更好地理解...

    Python.Data.Science.Essentials..Alberto.Boschetti

    本书还介绍了几个在数据科学领域中不可或缺的Python库: **NumPy**:NumPy是Python中用于处理大型多维数组和矩阵的基础库,同时还提供了大量的数学函数来操作这些数组。它是进行高效数值计算的基石。 **SciPy**:...

    javaSE代码实例

    第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java目录的解读 7 1.3...

Global site tag (gtag.js) - Google Analytics