一、基本定义

/*
*简单工厂设计模式:
*文字描述理解:
* 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。
* 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常
* 都具有共同的父类。
* */ 二、首先创建Apple、Banana实体类
public class Apple {

    public void eat(){
System.out.println("吃苹果");
}
}
public class Banana {
public void eat(){
System.out.println("吃香蕉");
}
}

编写测试类:

public class MainClass {

    public static void main(String[] args) {
//实例Apple
Apple apple = new Apple();
//实例Banana
Banana banana = new Banana(); apple.eat();
banana.eat(); //可以发现Apple、Banana可以共同抽象出一个接口eat } }

在运行中,我们发现Apple、Banana类都有共同的方法。那么我们就可以抽象出来一个接口来实现。修改代码如下:

public interface Fruit {
void eat();
}
public class Apple implements Fruit {

    @Override
public void eat() {
System.out.println("吃苹果");
}
}
public class Banana implements Fruit{
@Override
public void eat() {
System.out.println("吃香蕉");
}
}
public class MainClass {

    public static void main(String[] args) {
/*
//实例Apple
Apple apple = new Apple();
//实例Banana
Banana banana = new Banana(); apple.eat();
banana.eat();
**/ //可以发现Apple、Banana可以共同抽象出一个接口eat,多态实例化
Fruit apple = new Apple();
Fruit banana = new Banana();
apple.eat();
banana.eat();
//按照定义:通过专门定义一个类来负责创建其他类的实例,那么我们就需要创建FruitFactory实例,具体代码如下。 } }

创建FruitFactory工厂类:

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

MainClass测试类;

public class MainClass {

    public static void main(String[] args) {
/*
//实例Apple
Apple apple = new Apple();
//实例Banana
Banana banana = new Banana(); apple.eat();
banana.eat();
**/ //可以发现Apple、Banana可以共同抽象出一个接口eat,多态实例化
// Fruit apple = new Apple();
// Fruit banana = new Banana();
// apple.eat();
// banana.eat();
//按照定义:通过专门定义一个类来负责创建其他类的实例FruitFactory
Fruit apple = new FruitFactory().getApple();
Fruit banana = new FruitFactory().getBanana();
apple.eat();
banana.eat();
} }

那么我们有没有具体什么需要改进的地方?FruitFactory表明静态方法。这样就不用再新建实例化了。

public class FruitFactory {
/*
*获得Apple类的实例
* */
public static Fruit getApple(){
return new Apple();
} /*
*获得Banana类的实例
* */
public static Fruit getBanana(){
return new Banana();
}
}
     //直接类名调用即可。 
Fruit apple = FruitFactory.getApple();
Fruit banana = FruitFactory.getBanana();
apple.eat();
banana.eat();

三、模式中包含的角色和职责

1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

  比如:我们本次创建的FruitFactory

2.抽象(Product)角色,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象

FruitFactory我们需要抽象一个具体方法,get所有的对象实例化。

public class FruitFactory {
// /*
// *获得Apple类的实例
// * */
// public static Fruit getApple(){
// return new Apple();
// }
//
// /*
// *获得Banana类的实例
// * */
// public static Fruit getBanana(){
// return new Banana();
// } //get所有的对象
public static Fruit getFruit(String name) throws IllegalAccessException, InstantiationException {
if (name.equalsIgnoreCase("apple")){
return Apple.class.newInstance();
}else if (name.equalsIgnoreCase("banana")){
return Banana.class.newInstance();
}else {
return null;
}
}
}
           //测试类
Fruit apple = FruitFactory.getFruit("apple");
Fruit banana = FruitFactory.getFruit("banana");
apple.eat();
banana.eat();

FruitFactory里面的get实例,我们可以继续优化。

public class FruitFactory {
// /*
// *获得Apple类的实例
// * */
// public static Fruit getApple(){
// return new Apple();
// }
//
// /*
// *获得Banana类的实例
// * */
// public static Fruit getBanana(){
// return new Banana();
// } //get所有的对象
public static Fruit getFruit(String name) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
// if (name.equalsIgnoreCase("apple")){
// return Apple.class.newInstance();
// }else if (name.equalsIgnoreCase("banana")){
// return Banana.class.newInstance();
// }else {
// return null;
// } Class<?> aClass = Class.forName(name);
return (Fruit) aClass.newInstance(); }
}

注意:测试类测试传入的String类型;

        Fruit apple = FruitFactory.getFruit("Apple");
Fruit banana = FruitFactory.getFruit("Banana");
apple.eat();
banana.eat();
Class<?> aClass = Class.forName(name);
这部分代码的调用,比之前相比比较灵活了。

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

一般推荐第二种比较好。

那么,这种模式具体会在哪些方面应用比较多。

比如:在JDBC不同数据库实现方面。

java简单工厂设计模式的更多相关文章

  1. Java反射机制(五):使用反射增强简单工厂设计模式

    关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍:  我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...

  2. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  3. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

  4. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

  5. php设计模式课程---2、为什么会用到简单工厂设计模式

    php设计模式课程---2.为什么会用到简单工厂设计模式 一.总结 一句话总结: 比如调用数据库的语句,如果调用的数据库名字改了,或者调用的数据库类型改了(比如从Mysql用到了Mysqli),那么要 ...

  6. 利用Java反射机制优化简单工厂设计模式

    之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...

  7. 设计模式(二)——Java简单工厂模式

    简单工厂模式 案例: 披萨的项目(要便于披萨种类的扩展,要便于维护) 1)披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2)披萨的制作有 prepare,bake, cut, ...

  8. Java设计模式之简单工厂设计模式

    简单工厂将业务逻辑部分和界面逻辑部分分离开来,降低了界面逻辑和业务逻辑的耦合度,符合面向对象迪米特法则.下面以一个加法减法运算器为例,各位读者可以自行按照这种设计方式设计出一个小小的运算器. 1.业务 ...

  9. 简单工厂设计模式--Java设计模式(一)

    一 概念: 简单工厂模式就是通过一个工厂类根据参数动态创建对应的类. 二 案例 我们以汽车作为例子,在现实生活中汽车只是一个抽象的产品,其中有很多类型的汽车才是具体产品,如奔驰.宝马.保时捷等等(当然 ...

随机推荐

  1. springboot与消息(rabbtiMQ)

    1.大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 1.1异步通信 1.2解耦 1.3削峰 2.消息服务中两个重要概念:       消息代理(message broker)和目的地 ...

  2. 未能映射路径"/"

    1.检查Server.MapPath 这里面需要像这样:  ~/uploads/   有~符号. 2.应用程序池出现问题,换一个应用程序池,或者重启程序池.

  3. MongoDB增加用户认证: 增加用户、删除用户、修改用户密码、读写权限、只读权限

    1.添加并验证用户 > use admin> db.addUser("zjx","tsjianxin") #添加用户 > db.auth(&q ...

  4. git忽略某个文件夹

    data/cache/* !data/cache/index.html !data/cache/smiOAuthToken.php

  5. Laravel 上传文件处理

    文件上传 获取上传的文件 可以使用 Illuminate\Http\Request 实例提供的 file 方法或者动态属性来访问上传文件, file 方法返回 Illuminate\Http\Uplo ...

  6. [转]Android Parcelable和Serializable的区别

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

  7. IRC聊天指南

    参考https://www.cnblogs.com/fzzl/archive/2011/12/26/2302637.html

  8. C# Http请求接口数据的两种方式Get and Post

    面向接口编程是一种设计思想,无论用什么语言都少不了面向接口开发思想,在软件开发过程中,常常要调用接口,接下来就是介绍C#调用其它开发商提供的接口进行获取数据,http接口方式获取接口数据. Get请求 ...

  9. 如何把asp.net上的服务在iis调试

    1,在iis上部署一个应用,路径指向工程目录 2,在vs2012(其他版本没试过,10都很久没用不记得了)中打开网站,选择本地iis 3,在你想调试的地方设置断点,F5,搞定!

  10. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

    题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...