一、基本定义

/*
*简单工厂设计模式:
*文字描述理解:
* 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。
* 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常
* 都具有共同的父类。
* */ 二、首先创建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. 创建和运行Java项目

    ---------siwuxie095                     首先在左侧的工程管理面板 Package Explorer 中,右键->New->Java Project ...

  2. Spring Boot 集成servlet,发布为可直接运行的war包,方便后续打包为docker镜像。

    背景:Spring Boot 集成servlet,发布为可直接运行的war包,方便后续打包为docker镜像. 原文地址 https://github.com/weibaohui/springboot ...

  3. 优化 resolv.conf

    DNS lookup 在把域名解析成 IP 过程中耽误了不少时间,尤其是访问比较复杂的网站的时候,比如某个页面包含多个 url,一次请求需要做多次 DNS 解析,并且从用户浏览器到 DNS serve ...

  4. 通过HttpWebRequest实现模拟登陆

    1>通过HttpWebRequest模拟登陆 using System; using System.Collections.Generic; using System.Linq; using S ...

  5. [转].NET 4.5+项目迁移.NET Core的问题记录 HTTP Error 502.5

    本文转自:http://www.cnblogs.com/ronli/p/5900001.html 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过 ...

  6. 静态方法调静态属性用self,$this不可以

  7. 启动项目报错:502 Server dropped connection The following error occurred while trying to access http://localhost:8080/TestDemo:

    之前的项目一直是好的,可以启动,但最近启动出了问题,访问不了,于是找到原因发现是启用了访问国外网站的加速器, 更改了浏览器的代理模式,如下: 解决方法: 打开浏览器,进入到浏览器的网络设置中,将局域网 ...

  8. mybatis Generator 生成配置文件

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE generatorConfiguration ...

  9. 整理悬浮在列表中a元素时改变a元素上下边框颜色的问题。

    整理一下当悬浮在a元素上时a的上下边颜色改变,并且里面的内容不会移动,下面是PSD图效果区域: 刚开始我先给A元素加了上下边框和颜色,利用a:hover改变a元素上下的边框颜色,但是第一个a元素的下边 ...

  10. HDU 3157 Crazy Circuits (有源汇上下界最小流)

    题意:一个电路板,上面有N个接线柱(标号1~N)   还有两个电源接线柱  +  - 然后是 给出M个部件正负极的接线柱和最小电流,求一个可以让所有部件正常工作的总电流. 析:这是一个有源汇有上下界的 ...