简单工厂(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. Hibernate之多对多

    一.项目结构如下图 二.保存学生和课程及其学生选课关系代码如下(测试类中不能再有双向关联,否则会报错,因为,都维护了中间表外键,会有中间表外键冲突,如果非要写双向关联,就需要配置中设置某一方维护主键, ...

  2. Linux下如何搭建VPN服务器(转)

    VPN服务器的配置与应用 实验场景 通过将Linux配置VPN服务器允许远程计算机能够访问内网. 我的目的: 现在需要开发第三方接口,而第三方接口有服务器IP地址鉴权配置,这样在本地开发出来的程序每次 ...

  3. 配置 Apache+php多端口多站点(转载)

    配置httpd.conf监听多个端口 #增加监听端口 等以下内容都设置以后,可以通过 netstat -n -a查看端口是否开启 开启虚拟站点 # Virtual hosts#Include conf ...

  4. C/C++中的getline函数总结:

    来自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html C/C++中的getline函数总结 getline函数是一个比较 ...

  5. PQ格式化虚拟机硬盘如何生效

    用pq格式化虚拟机硬盘后,安装时,总是从dhcp的网卡启动,没有从硬盘启动 但是用ghost是可以拷贝镜像文件的 这就是说,硬盘有了,但是没有将硬盘"激活",没有将硬盘设为acti ...

  6. 解决mysqldump: Got error: 1044: Access denied for user

    转自:http://blog.slogra.com/post-512.html 今天给新加的几个数据库备份,在执行mysqldump的时候,居然报mysqldump: Got error: 1044: ...

  7. 浏览器兼容性小整理和一些js小问题(后面会继续更新)

    最近在啃jQuery的源码,估计会啃到很多浏览器兼容性的问题,所以整理一下 1,IE下的内存泄露. 在IE中不在DOM树中的独立节点有javascript变量引用它的时候不会被回收. 解决:手动将该j ...

  8. The Dragon of Loowater

      The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into ...

  9. shell kill掉含同一字符的关键字的进程

    如何kill掉进程名包含某个字符串的一批进程:kill -9 $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ') 观 ...

  10. 你真的会用AsyncTask吗?(一)

    一个典型AsyncTask的. view source print? 01 public class DialogTestActivity extends Activity { 02     priv ...