简单工厂(Simple Factory,创建型模式)

第一步:

比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用,但是我们发现Apple和Banana都有采集get的方法,所以我们使用Fruit接口进行抽象出来,接口中有一个get方法,然后由Apple类和Banana类去实现,在调用的使用我们就可以使用多态了

第二步:

我们发现每次都需要自己去new一个Apple和Banana,感觉不爽,于是我们就去新建一个FruitFactory工厂类进行封装这个new的过程,分别写了两个静态的getAppleInstance()和getBananaInstance()方法,然后在main方法中通过FruitFactory进行调用

第三步:

我们发现FruitFactory的两个方法都是获取相应的实例,于是我们就将这两个方法封装为一个方法,getFruitInstance(String className)进行获取相应的实例调用。采用的是if else判断className来获取实例

第四步:

我们将getFruitInstance(String className)方法进行改进,使用反射的机制根据传入的类的全名称来获取实例,缺点是调用者必须要知道类的全名称是什么。

以上四步就是简单工厂的基本使用

代码实现如下:

Apple.java

package com.designpattern.simplefactory;

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

Banana.java

package com.designpattern.simplefactory;

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

Fruit.java

package com.designpattern.simplefactory;

public interface Fruit {
public void get();
}

FruitFactory.java

package com.designpattern.simplefactory;

public class FruitFactory {
// public static Fruit getAppleInstance(){
// return new Apple();
// }
//
// public static Fruit getBananaInstance(){
// return new Banana();
// } public static Fruit getFruitInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
// if(className.equalsIgnoreCase("Apple")){
// return new Apple();
// }
// else if(className.equalsIgnoreCase("Banana")){
// return new Banana();
// }
// else {
// System.out.println("没有该类型的实例");
// return null;
// } //使用反射机制,必须知道类的全名称
Class class1 = Class.forName(className);
return (Fruit)class1.newInstance();
}
}

MainClass.java

package com.designpattern.simplefactory;

public class MainClass {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
/*
* 使用了多态,因为这里需要new 一个实例对象,所以使用工厂封装方法
*/
// Fruit apple = new Apple();
// apple.get();
// Fruit banana = new Banana();
// banana.get(); /*
* 通过工厂调用各自的方法获取实例
*/
// Fruit apple = FruitFactory.getAppleInstance();
// apple.get();
// Fruit banana =FruitFactory.getBananaInstance();
// banana.get(); /*
* 进一步封装实例方法使用
*/
Fruit apple = FruitFactory.getFruitInstance("com.designpattern.simplefactory.Apple");
apple.get();
Fruit banana =FruitFactory.getFruitInstance("com.designpattern.simplefactory.Banana");
banana.get(); } }

一、什么是简单工厂模式

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

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

在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

设计模式学习之简单工厂(Simple Factory,创建型模式)(1)的更多相关文章

  1. Java 23种设计模式详尽分析与实例解析之一--创建型模式

    面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...

  2. 设计模式之美:Creational Patterns(创建型模式)

    创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...

  3. 简单工厂(Simple Factory),最合适的设计模式首秀.

    简单工厂又称为静态工厂方法(static factory method)模式,简单工厂是由一个工厂来决定创建出哪一种个体的实现,在很多的讨论中,简单工厂做为工厂方法模式(Factory Method) ...

  4. 使用C# (.NET Core) 实现简单工厂(Simple Factory) 和工厂方法设计模式 (Factory Method Pattern)

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...

  5. 设计模式:简单工厂(Simple Factory)

    定义:根据提供的数据或参数返回几种可能类中的一种. 示例:实现计算器功能,要求输入两个数和运算符号,得到结果. 结构图: HTML: <html xmlns="http://www.w ...

  6. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  7. 【C++深入浅出】设计模式学习之简单工厂

    看大话设计模式中大牛对小菜的精辟点评,也写了一个计算器程序,并跟着点评一路改良,还是不过瘾,应用了类模板和异常捕捉机制重写了程序. 本文不能算干货,恰当的比方是饭前甜点,吃一口有点味.有点意思,总归太 ...

  8. 设计模式学习之抽象工厂(Abstract Factory,创建型模式)(3)

    假如我们的苹果和香蕉还分为北方的和南方的,那么苹果Apple和香蕉Banana就是抽象类了,所以采集的方法就应该抽象的 第一步: 我们会创建北方的苹果NorthApple类和SourthBanana类 ...

  9. 创建型模式(过渡模式) 简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...

随机推荐

  1. java的static块执行时机

    一.误区:简单认为JAVA静态代码块在类被加载时就会自动执行.证错如下: class MyClass1 { static {//静态块 System.out.println("static  ...

  2. php扩展redis

    Redis安装整理(window平台) +php扩展redis 分类: Web开发2013-03-23 18:51 8258人阅读 评论(3) 收藏 举报                        ...

  3. linux(Debian)下安装与MySql的安装、卸载、配置及使用

    参考资料:http://www.cnblogs.com/xusir/p/3334217.html 以下是简要记录. 一.安装 安装:apt-get install mysql-server mysql ...

  4. redhat RHEL 5.5 下载地址

    redhat RHEL 5.5 下载地址 RHEL 5 update 5 已经release许久了, redhat RHEL 5.5 下载地址: RHEL 5 安装 序列号 rhel-server-5 ...

  5. CSS居中完全解决方案

    上次面试面试官问到了,问了个定宽局中和不定宽局中,下来我把所有有关CSS居中都总结了一下 原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 水平居中 行内元素 把行内元素 ...

  6. Truck History(prim & mst)

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19772   Accepted: 7633 De ...

  7. codeforces 257div2 B. Jzzhu and Sequences(细节决定一切)

    题目链接:http://codeforces.com/contest/450/problem/B 解题报告:f1 = x,f2 = y,另外有当(i >= 2) fi = fi+1 + fi-1 ...

  8. 用 VeraCrypt 加密闪存盘

    导读 很多安全专家偏好像 VeraCrypt 这类能够用来加密闪存盘的开源软件,是因为可以获取到它的源代码.要是你需要在 Windows 系统,苹果的 OS X 系统或者 Linux 系统上加密以及访 ...

  9. 在C/C++程序里打印调用栈信息

    我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...

  10. hiho一下 第九十五周 数论四·扩展欧几里德

    题目 : 数论四·扩展欧几里德 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho周末在公园溜达.公园有一堆围成环形的石板,小Hi和小Ho分别站在不同的石板上 ...