一、基本定义

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

    <?php $file = '12.jpg'; //打开图片 $im = imagecreatefromjpeg($file); //设置水印字体颜色 $color = imagecoloral ...

  2. socket的protocal参数

    Documentation for socket() on Linux is split between various manpages including ip(7) that specifies ...

  3. mybatis框架入门程序:演示通过mybatis实现数据库的模糊查询操作

    1. mybatis的基本准备操作见我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10149480.html 2. 根据用户名查询用户信息: (1)映射文件 ...

  4. ubuntu下安装最新的nodejs

    # apt-get update # apt-get install -y python-software-properties software-properties-common # add-ap ...

  5. AI ML DL

    在经历了蛮荒的PC互联网时代,混战的移动互联网时代,到现今最火的人工智能时代. 大数据.云计算.机器学习的技术应用,已经使得IT从业者的门槛越来越高. 套用一句樊登读书会的宣传口号“keep lear ...

  6. VGGNet

    VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和 GoogleDeepMind 公司的研究员一起研发的的深度卷积神经网络. 在ImageNet大型视觉识别挑战 IL ...

  7. ubuntu 出来菜单栏和任务栏

    http://blog.csdn.net/terence1212/article/details/51340595 命令行输入:sudo apt-get install compizconfig-se ...

  8. java 文件中 定义一个字符串,它的默认编码是什么?

    .java 文件的编码就是 String 字符串的编码 File 文件的编码就是 文件内容的编码 request 的设置的编码就是inputstream 的编码 jvm 的默认编码(the defau ...

  9. ios10适配

    1: 去除打印多余的log信息: xcode-->Product-->Scheme-->edite Scheme 中在Ecvironment Variables 中添加OS_ACTI ...

  10. UISwitch的常见属性

    1.onTintColor属性:设置ON一边的背景颜色,默认是绿色. 2.tintColor属性:设置OFF一边的背景颜色,默认是灰色,发现OFF背景颜色其实也是控件”边框“颜色. 3.thumbTi ...