一、什么是简单工厂模式

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

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

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. Ibatis/Mybatis模糊查询

    Ibatis/Mybatis模糊查询 根据网络内容整理 Ibatis中 使用$代替#.此种方法就是去掉了类型检查,使用字符串连接,不过可能会有sql注入风险. Sql代码 select * from ...

  2. Jquery detect page refresh

    first thing there are 3 functions we will use: function setCookie(c_name, value, exdays) {           ...

  3. jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查

    1简单的Mvc,分层建包. java resources src/mian/java (1)dao 包 JDBC连接类,连接数据库.增删改查方法,其他的方法. (2)model包 实体类,数据库字段, ...

  4. adb的一些常用的命令

    如果在dos界面想要直接用adb的话,需要将anroidsdk安装目录下的tools和platform-tools以及加入到环境变量path中. 查看当前的设备(包括真机和模拟器):adb devic ...

  5. java多线程实例

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurr ...

  6. for of 与 for in 的区别

    遍历数组通常使用for循环,ES5的话也可以使用forEach,ES5具有遍历数组功能的还有map.filter.some.every.reduce.reduceRight等,只不过他们的返回结果不一 ...

  7. 了解大数据的特点、来源与数据呈现方式以及用Python写Mad Libs游戏

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2620. 1.浏览2019春节各种大数据分析报告,例如: 这世间,再 ...

  8. Python bin() 函数

    Python bin() 函数  Python 内置函数 描述 bin() 返回一个整数 int 或者长整数 long int 的二进制表示. 语法 以下是 bin() 方法的语法: bin(x) 参 ...

  9. OptionParser模块学习

    from optparse import OptionParser import sys useage = [] test_parser = OptionParser(usage="%pro ...

  10. PAT 1079 延迟的回文数(代码+思路)

    1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0.N 被称 ...