java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说就是,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
首先举个例子:创建两个类,一个Apple,一个Banana,都有个一方法
public class Apple{
public void get(){
System.out.println("采集苹果");
}
}
public class Banana{
public void get(){
System.out.println("采集香蕉");
}
}
在创建一个主方法来调用这两个类中的方法
public class MainClass {
public static void main(String[] args) {
//实例化Apple
Apple apple = new Apple();
//实例化Banana
Banana banana = new Banana();
apple.get();
banana.get();
}
}
执行后,输出结果为:
采集苹果
采集香蕉
但是代码还可以改进,可以看出Apple与Banana的功能类似,所以可以抽取出一个接口,并让Apple与Banana实现此接口
public interface Fruit {
public void get();
}
public class Apple implements Fruit{
public void get(){
System.out.println("采集苹果");
}
}
public class Banana implements Fruit{
public void get(){
System.out.println("采集香蕉");
}
}
这时,主方法调用形式就变成了这样
public class MainClass {
public static void main(String[] args) {
//实例化一个Apple,用到了多态
Fruit apple = new Apple();
//实例化一个Banana,用到了多态
Fruit banana= new Banana();
apple.get();
banana.get();
}
}
这样还是刚才的结果,不同的代码达到了相同的目的。
而简单工厂模式则是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,上面的代码可以看出Apple与Banana实现了同一个接口,所以我们还需要创建一个工厂类来专门创建Apple与Banana的实例,继续改进
创建一个工具类
public class FruitFactory {
//获取Apple的实例,用static修饰,方便使用
public static Fruit getApple(){
return new Apple();
}
//获取Banana的实例,用static修饰,方便使用
public static Fruit getBanana(){
return new Banana();
}
}
Apple类,Banana类与Fruit接口没有变化
主方法修改为
public class MainClass {
public static void main(String[] args) {
//实例化一个Apple,用到了工厂类
Fruit apple = FruitFactory.getApple();
//实例化一个Banana,用到了工厂类
Fruit banana= FruitFactory.getBanana();
apple.get();
banana.get();
}
}
同样和之前是一样的结果
这就是一个简单工厂模式的基本使用了,但这样的工厂类还不够好,例子中只有两个实例对象,但如果例子多了以后,工厂类就会产生很多很多的get方法。所以进行如下优化
public class FruitFactory {
public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException{
//不区分大小写
if(type.equalsIgnoreCase("Apple")){
return Apple.class.newInstance();
}else if(type.equalsIgnoreCase("Banana")){
return Banana.class.newInstance();
}else{
System.out.println("找不到相应的实体类");
return null;
}
}
}
这时主方法修改为:
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
//实例化一个Apple,用到了工厂类
Fruit apple = FruitFactory.getFruit("apple");
//实例化一个Banana,用到了工厂类
Fruit banana= FruitFactory.getFruit("banana");
apple.get();
banana.get();
}
}
这样就可以根据传入的参数动态的创建实例对象,而且传入的参数还可以自定义,非常的灵活,但缺点也很明显,工厂类中有大量的判断
还有另外一种方式
public class FruitFactory {
public static Fruit getFruit(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class fruit = Class.forName(type);
return (Fruit) fruit.newInstance();
}
}
主方法修改为
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//实例化一个Apple,用到了工厂类
Fruit apple = FruitFactory.getFruit("Apple");
//实例化一个Banana,用到了工厂类
Fruit banana= FruitFactory.getFruit("Banana");
apple.get();
banana.get();
}
}
这种方法可以看到,工厂类非常的简洁,但主方法在调用时,输入的参数就固定了,必须为实例类名,不像上一种方法那么灵活。
这两种方法各有各的优点,可根据实际情况自己选择。
下面介绍一下简单工厂模式中的角色与职责
简单工厂模式中包含的角色及其职责
1、工厂(Creater)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。(FruitFactory类)
2、抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。(Fruit接口)
3、具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象。(Apple类与Banana类)
简单设计模式的优缺点:
- 优点:简单工厂模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在创建时可以直接使用工厂类去创建所需的实例,而无需去了解这些对象是如何创建以及如何组织的,明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
- 缺点:很明显简单工厂模式的缺点也体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则,另外,当系统中的具体产品类不断增多时,可能会出现要求更改相应工厂类的情况,拓展性并不是很好。
使用场景
java设计模式-----1、简单工厂模式的更多相关文章
- (1)java设计模式之简单工厂模式
一:简单工厂模式的优点 --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...
- Java 设计模式01 - 简单工厂模式
先要学习设计模式之前的先看看一些基础 UML类图简单说明 可以先看看我的这篇博客: UML类图简单说明,学习编程思路的必会技能 接下来才是重点,开始我们的旅程吧. 一.UML类图展示 我们要用简单工厂 ...
- Java设计模式(1)——简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 一.模式中包含的角色及其职责 1.工厂(Creator)角色 简单 ...
- Java 设计模式之 简单工厂模式(静态工厂方法模式)
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的 ...
- java设计模式之简单工厂模式
简单工厂: 简单工厂的优点: 1.去除客户端与具体产品的耦合,在客户端与具体的产品中增加一个工厂类,增加客户端与工厂类的耦合 2.封装工厂类,实现代码平台的复用性,创建对象的过程被封装成工厂类,可以多 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- Java中的简单工厂模式
举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
随机推荐
- 配置python+mod_wsgi+apache 时 在浏览器中访问服务器时报错:Invalid HTTP_HOST header: 'XXXXX'. You may need to add u'XXXXX' to ALLOWED_HOSTS,在setting.py中添加‘*”无效的原因
配置python+mod_wsgi+apache 时 在浏览器中访问服务器时报错:Invalid HTTP_HOST header: 'XXXXX'. You may need to add u'XX ...
- 找不到javax.servlet.Filter类,
找不到javax.servlet.Filter类, 在构建的依赖包中缺少servlet.api
- flying中的AOP和IOC
注入属性:private synchronized void injectReferenceServices() { if(this.injectReferenceServicesInitialize ...
- 豹哥嵌入式讲堂:ARM知识概要杂辑(4)- Cortex-M处理器性能指标
1.处理器的性能指标 用于评价CPU的性能指标非常多,不同的性能侧重点下的测试标准可能得出的指标值不同,下面介绍嵌入式行业广泛使用的两个经典的测试标准. 1.1 Dhrystone标准 Dhrysto ...
- 【转】shell:date 常用方式
在linux下获取时间字符串 命令 date # 以yyyymmdd格式输出23天之前现在这个时刻的时间 $ date +%Y%m%d –date=’23 days ago’ $ date -u Th ...
- GO开发:用go写个日志监控系统
日志收集系统架构 1.项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可满足 c. 当系统机器规模巨大,登陆到机器上查看几乎不现 ...
- LINUX打开文件
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- HTML5之Notification简单使用
var webNotification = { init: function() { if(!this.isSupport()) { console.log('不支持通知'); return; } t ...
- 用swing做一个简单的正则验证工具
直接上代码吧,因为我对swing也不熟悉,照着API一点点拼出来的. import java.awt.event.ActionEvent; import java.awt.event.ActionLi ...
- WPF: 只读依赖属性的介绍与实践
在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等.事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称"只读属性" ...