java简单工厂设计模式
一、基本定义
/*
*简单工厂设计模式:
*文字描述理解:
* 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。
* 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常
* 都具有共同的父类。
* */ 二、首先创建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简单工厂设计模式的更多相关文章
- Java反射机制(五):使用反射增强简单工厂设计模式
关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍: 我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
- Java简单工厂模式
Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...
- php设计模式课程---2、为什么会用到简单工厂设计模式
php设计模式课程---2.为什么会用到简单工厂设计模式 一.总结 一句话总结: 比如调用数据库的语句,如果调用的数据库名字改了,或者调用的数据库类型改了(比如从Mysql用到了Mysqli),那么要 ...
- 利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...
- 设计模式(二)——Java简单工厂模式
简单工厂模式 案例: 披萨的项目(要便于披萨种类的扩展,要便于维护) 1)披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2)披萨的制作有 prepare,bake, cut, ...
- Java设计模式之简单工厂设计模式
简单工厂将业务逻辑部分和界面逻辑部分分离开来,降低了界面逻辑和业务逻辑的耦合度,符合面向对象迪米特法则.下面以一个加法减法运算器为例,各位读者可以自行按照这种设计方式设计出一个小小的运算器. 1.业务 ...
- 简单工厂设计模式--Java设计模式(一)
一 概念: 简单工厂模式就是通过一个工厂类根据参数动态创建对应的类. 二 案例 我们以汽车作为例子,在现实生活中汽车只是一个抽象的产品,其中有很多类型的汽车才是具体产品,如奔驰.宝马.保时捷等等(当然 ...
随机推荐
- 4-圆数Round Numbers(数位dp)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14947 Accepted: 6023 De ...
- Yii2 windows 安装步骤
安装 Yii2 高级版应用 基础版可以看官方文档 今天安装了YII2高级版应用 写下步骤 留个记号,以备查询! 在 Windows 中,你首先需要下载并运行 Composer-Setup.exe 查看 ...
- windows聚焦图片文件重命名bash脚本
win10聚焦路径为: %localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalStat ...
- 统计学中z分布、t分布、F分布及χ^2分布
Z就是正态分布,X^2分布是一个正态分布的平方,t分布是一个正态分布除以(一个X^2分布除以它的自由度然后开根号),F分布是两个卡方分布分布除以他们各自的自由度再相除 比如X是一个Z分布,Y(n)=X ...
- RocketMQ 自定义文件路径
一 .1. 修改store路径2. 修改logs路径3. 修改rmq_bk_gc.log路径4. 修改rmq_srv_gc.log路径二 .1. 获取正确的rocketmq 源码2. 地址:https ...
- SCI EI期刊
coming soon 关键字:Computer Vision, Computing, Image, Intelligence, IEEE, Compution <Journal of Expe ...
- java并发编程实战:第三章----对象的共享
我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...
- HighCharts使用总结
1.常用属性 chart: type:areaspline(线面图).arearange(区间图) zoomType: 缩放类型(沿着'xy'轴缩放) alignTicks:设置坐标轴刻度对齐. 当有 ...
- 使用Docker、CoreOS、Mesos部署可扩展的Web应用
[编者的话]本文作者重点介绍了如何使用Docker.CoreOS.Mesos.Vulcand.对象存储来部署一个可扩展的Web应用,他首先介绍了为什么要选择这些工具以及与其它工具相比这些工具的优势.紧 ...
- 使用sn.exe为程序集签名
前言 在写上一篇随笔时,为理解EF事务底层的原理,我去Github上把EF的源码下载放到自己项目调试,不过在编译时遇到了下面这个报错信息.经过一番查阅,了解到了程序集签名(也称强名称签名)的概念.报错 ...