设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

简单工厂(Simple Factory,创建型模式)
第一步:
比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用,但是我们发现Apple和Banana都有采集get的方法,所以我们使用Fruit接口进行抽象出来,接口中有一个get方法,然后由Apple类和Banana类去实现,在调用的使用我们就可以使用多态了
第二步:
我们发现每次都需要自己去new一个Apple和Banana,感觉不爽,于是我们就去新建一个FruitFactory工厂类进行封装这个new的过程,分别写了两个静态的getAppleInstance()和getBananaInstance()方法,然后在main方法中通过FruitFactory进行调用
第三步:
我们发现FruitFactory的两个方法都是获取相应的实例,于是我们就将这两个方法封装为一个方法,getFruitInstance(String className)进行获取相应的实例调用。采用的是if else判断className来获取实例
第四步:
我们将getFruitInstance(String className)方法进行改进,使用反射的机制根据传入的类的全名称来获取实例,缺点是调用者必须要知道类的全名称是什么。
以上四步就是简单工厂的基本使用
代码实现如下:
Apple.java
package com.designpattern.simplefactory;
public class Apple implements Fruit{
public void get(){
System.out.println("采集苹果");
}
}
Banana.java
package com.designpattern.simplefactory;
public class Banana implements Fruit{
public void get(){
System.out.println("采集香蕉");
}
}
Fruit.java
package com.designpattern.simplefactory;
public interface Fruit {
public void get();
}
FruitFactory.java
package com.designpattern.simplefactory;
public class FruitFactory {
// public static Fruit getAppleInstance(){
// return new Apple();
// }
//
// public static Fruit getBananaInstance(){
// return new Banana();
// }
public static Fruit getFruitInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
// if(className.equalsIgnoreCase("Apple")){
// return new Apple();
// }
// else if(className.equalsIgnoreCase("Banana")){
// return new Banana();
// }
// else {
// System.out.println("没有该类型的实例");
// return null;
// }
//使用反射机制,必须知道类的全名称
Class class1 = Class.forName(className);
return (Fruit)class1.newInstance();
}
}
MainClass.java
package com.designpattern.simplefactory;
public class MainClass {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
/*
* 使用了多态,因为这里需要new 一个实例对象,所以使用工厂封装方法
*/
// Fruit apple = new Apple();
// apple.get();
// Fruit banana = new Banana();
// banana.get();
/*
* 通过工厂调用各自的方法获取实例
*/
// Fruit apple = FruitFactory.getAppleInstance();
// apple.get();
// Fruit banana =FruitFactory.getBananaInstance();
// banana.get();
/*
* 进一步封装实例方法使用
*/
Fruit apple = FruitFactory.getFruitInstance("com.designpattern.simplefactory.Apple");
apple.get();
Fruit banana =FruitFactory.getFruitInstance("com.designpattern.simplefactory.Banana");
banana.get();
}
}
一、什么是简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
二、简单工厂模式的优缺点
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。
设计模式学习之简单工厂(Simple Factory,创建型模式)(1)的更多相关文章
- Java 23种设计模式详尽分析与实例解析之一--创建型模式
面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...
- 设计模式之美:Creational Patterns(创建型模式)
创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...
- 简单工厂(Simple Factory),最合适的设计模式首秀.
简单工厂又称为静态工厂方法(static factory method)模式,简单工厂是由一个工厂来决定创建出哪一种个体的实现,在很多的讨论中,简单工厂做为工厂方法模式(Factory Method) ...
- 使用C# (.NET Core) 实现简单工厂(Simple Factory) 和工厂方法设计模式 (Factory Method Pattern)
本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...
- 设计模式:简单工厂(Simple Factory)
定义:根据提供的数据或参数返回几种可能类中的一种. 示例:实现计算器功能,要求输入两个数和运算符号,得到结果. 结构图: HTML: <html xmlns="http://www.w ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- 【C++深入浅出】设计模式学习之简单工厂
看大话设计模式中大牛对小菜的精辟点评,也写了一个计算器程序,并跟着点评一路改良,还是不过瘾,应用了类模板和异常捕捉机制重写了程序. 本文不能算干货,恰当的比方是饭前甜点,吃一口有点味.有点意思,总归太 ...
- 设计模式学习之抽象工厂(Abstract Factory,创建型模式)(3)
假如我们的苹果和香蕉还分为北方的和南方的,那么苹果Apple和香蕉Banana就是抽象类了,所以采集的方法就应该抽象的 第一步: 我们会创建北方的苹果NorthApple类和SourthBanana类 ...
- 创建型模式(过渡模式) 简单工厂模式(Simple Factory)
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...
随机推荐
- params参数的调用
namespace params参数的用法 { class Program { public static void Test(string name,params int[] score) { ; ...
- linux3
第一课:date +%Y-%m-%d 显示日期date +%H:%M 显示小时分钟date 显示日期 vi /etc/sysconfig/network-scripts/ifcfg-eth0 网卡配置 ...
- spring属性依赖注入
一.构造方法方式注入 1.项目结构如下: 2.新建Customer类 package hjp.spring.attributeinject; public class Customer { priva ...
- MACD、BOLL、KDJ 三大组合精准把握趋势与买卖!
先看示意图,下图是布林线的3个轨道,其他都是股价走势 图1 股价,在布林线上轨.下轨之间运作.准确说,这话是不符合逻辑的,不是先有的轨道,然后股价再按照轨道运动.因为轨道是跟股价同时变化的.但是,股价 ...
- hdu 1013 Digital Roots
#include <stdio.h> int main(void) { int m,i;char n[10000]; while(scanf("%s",&n)= ...
- IIS短文件名泄露漏洞危害及防范方法
危害级别:轻微 IIS短文件名泄露漏洞 WASC Threat Classification 描述: Microsoft IIS在实现上存在文件枚举漏洞,攻击者可利用此漏洞枚举网络服务器根目录中的文件 ...
- WAF绕过小结
WAF介绍 什么是WAF? Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品. 基本/简单绕过方法: 1.注释符 http://www.site. ...
- linux安全加固(1)
Redhat是目前企业中用的最多的一类Linux,而目前针对Redhat攻击的黑客也越来越多了.我们要如何为这类服务器做好安全加固工作呢? 一. 账户安全 1.1 锁定系统中多余的自建帐号 检查方法: ...
- springmvc中@PathVariable和@RequestParam的区别(百度收集)
http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNow=2 你可以把这地址分开理解,其中问号前半部分:http://lo ...
- C/C++内存分配区
一.起源 C++内存分成5个区,分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 但这个自由存储区这么一听还是模模糊糊的,和堆好像是一样的,还有同学说起这个问题. 二.个人理解 关于自由存 ...