一、什么是简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

二、模式中包含的角色及其职责

1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象

三、具体实例

现在有两个类,分别是Apple和Banana,都有一个Get方法:

Apple.java

package cc.dewdrop;

public class Apple{
public void get(){
System.out.println("采集苹果");
}
}

Banana.java

package cc.dewdrop;

public class Banana{
public void get(){
System.out.println("采集香蕉");
}
}

在主方法中实例化并分别调用个体方法:

package cc.dewdrop;

public class SimpleFactory {

	public static void main(String[] args) {
Apple apple = new Apple();
Banana banana = new Banana();
apple.get();
banana.get();
}
}

发现两个类都有一个共同的get方法,那么我们就可以抽象出一个接口,然后Apple和Banana两个类分别实现这个接口:

Fruit.java

package cc.dewdrop;

public interface Fruit {
public void get();
}

Apple.java

package cc.dewdrop;

public class Apple implements Fruit{
public void get(){
System.out.println("采集苹果");
}
}

Banana.java

package cc.dewdrop;

public class Banana implements Fruit{
public void get(){
System.out.println("采集香蕉");
}
}

在主方法中就可以使用下面这种方式来创建对象:

public class SimpleFactory {

	public static void main(String[] args) {
Fruit apple = new Apple();
Fruit banana = new Banana();
apple.get();
banana.get();
}
}

根据简单工厂模式的特点,现在就需要创建一个类来创建类的对象:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
/**
* 获得Apple实例
*/
public Fruit getApple() {
return new Apple();
} /**
* 获得Banana实例
*/
public Fruit getBanana() {
return new Banana();
}
}

在主方法中就可以使用如下方式进行调用:

public class SimpleFactory {

	public static void main(String[] args) {
Fruit apple = new FruitFactory().getApple();
Fruit banana = new FruitFactory().getBanana();
apple.get();
banana.get();
}
}

再进一步,我们可以修改工厂类,使用静态方法来创建对象:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
/**
* 获得Apple实例
*/
public static Fruit getApple() {
return new Apple();
} /**
* 获得Banana实例
*/
public static Fruit getBanana() {
return new Banana();
}
}

在主方法中就可以直接使用类名来调用:

public class SimpleFactory {

	public static void main(String[] args) {
Fruit apple = FruitFactory.getApple();
Fruit banana = FruitFactory.getBanana();
apple.get();
banana.get();
}
}

进一步改进工厂类,希望有一个公用的方法来创建所有产品的对象:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException {
if (type.equalsIgnoreCase("apple")) {
return Apple.class.newInstance();
} else if (type.equalsIgnoreCase("banana")) {
return Banana.class.newInstance();
} else {
System.out.println("class not found");
}
return null;
}
}

在主方法中使用如下方式调用:

public class SimpleFactory {

	public static void main(String[] args) {
Fruit apple = FruitFactory.getFruit("apple");
Fruit banana = FruitFactory.getFruit("banana");
apple.get();
banana.get();
}
}

这样调用工厂类创建对象的操作就简化了很多,但是还有一个缺点,就是如果在新增加一个类是,就必须修改工厂类。那么此时工厂类可以做出如下修改:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
public static Fruit getFruit(String type)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return (Fruit) Class.forName(type).newInstance();
}
}

需要注意一点的是,在调用的时候需要使用类的完整路径(包括包名):

public class SimpleFactory {

	public static void main(String[] args) {
Fruit apple = FruitFactory.getFruit("cc.dewdrop.Apple");
Fruit banana = FruitFactory.getFruit("cc.dewdrop.Banana");
apple.get();
banana.get();
}
}

四、简单工厂模式的优缺点

在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化
      不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

Java设计模式 -- 简单工厂模式(SimpleFactory)的更多相关文章

  1. Java设计模式-简单工厂模式(Static Factory Method)

    简单工厂模式(Static Factory Method) 简单工厂模式是类的创建模式,又叫静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种 ...

  2. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...

  3. 设计模式——简单工厂模式(SimpleFactory Pattern)

    最近做项目总是遇到这样或者那样的问题,代码不够简洁,代码可扩展性不够好,耦合度又太高了,导致经常有种想去重构又无从下手的感觉. 无意间翻出了之前买的一本书<大话设计模式>读了一遍,受益匪浅 ...

  4. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  5. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  6. java设计模式--简单工厂

    java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...

  7. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  8. 简单工厂模式 SimpleFactory

     简单工厂模式 SimpleFactory 1.1什么是简单工厂设计模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模 ...

  9. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

随机推荐

  1. TPCC-MySQL的安装与使用

    Tpcc-mysql 是 percona 基于 tpcc 衍生出来的产品,专用于 mysql 基准测试,其源码放在 bazaar 上( Bazaar 是一个分布式的版本控制系统,采用 GPL 许可协议 ...

  2. Inteiilj IDEA 团队代码格式规范

    目录 Intellij IDEA code format Tabs and Indents Spaces Wrapping and Braces Imports 更新 Intellij IDEA co ...

  3. 用JDBC如何调用存储过程

    package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; imp ...

  4. go语言channel的别样用法

    1.返回值使用通道 func main() { // 生成随机数作为一个服务 randService := randGenerator() // 从服务中读取随机数并打印 fmt.Printf(&qu ...

  5. Null Hypothesis and Alternate Hypothesis

    1.Null Hypothesis Overview 零假设,H0是普遍接受的事实;这与备择假设(alternate hypothesis)正好相反.研究人员努力否定.驳斥零假设.研究人员提出了另一种 ...

  6. svn: authentication cancelled

    从svn 下程序时用户名和密码输入正确后报如图错误! 控制台输出: svn: authentication cancelled    svn: authentication cancelled    ...

  7. VCP考试系统

      题目的格式如下,题目和题目之间用“==”隔开,每个题目的“题干”,“选项”,“答案”用“*”号隔开 An administrator wants to provide users restrict ...

  8. 在Objc项目中调用Swift

    之前的文字中记录了在Swift项目中调用OC的相关代码,比较简单直接 传送门 但是在OC中调用swift代码则不是那么的和谐,网络上很多文章业已经有点陈旧.记录步骤如下: 1.创建OC项目 (1)启动 ...

  9. Python threading 单线程 timer重复调用函数

    项目中需要使用定时器,每次都使用构造器函数调用: timer = threading.Timer(timerFlag, upload_position) timer.start() 打印线程后发现,每 ...

  10. RNA-seq要做几次生物学重复?找出来的100%都是真正的应答基因

    尹师妹:“哈师兄,做验证实验好辛苦,老板让我提高筛选差异基因的条件,尽量降低假阳性,我该怎么筛?” 小哈打开Evernote,给尹师妹看张表: “瞧见那个100%了吗?30 million mappe ...