Java 设计模式 (二)——工厂模式

992 阅读6分钟
本文系作者原创,如需转载请注明出处!

一、概述

本来是周末的时候打算写的,奈何公司周五和周六让我出差到加工厂调试BUG,对此我是持坚决反对以及强烈抗议的坚决态度的,并且对此行为是强烈谴责。破坏了我打算去咖啡厅写博客的美好计划(啧啧~要多去文艺的地儿对吧?万一就有妹子看上我咋办?缘分这种事儿很难说的)

这次就写工厂模式,设计模式这个系列我是这样打算写的,先从最常用和最简单的开始入手,再慢慢往深入

什么是工厂模式?工厂?对,工厂是生产东西的,工厂模式就是类似这样的一个情况

照旧,百度百科还是很好用的

百度百科:用工厂方法代替new操作的一种模式

我的理解是:工厂模式就是提供一个工厂方法,传入指定的参数得到我想要的对象。

工厂模式又分为:简单工厂模式,工厂模式、抽象工厂模式

简单工厂模式:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现

工厂模式:工厂模式本质就是代替new创建对象

抽象工厂模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式

二、运用

A、简单工厂模式

我去商店买水果,老板很懒,让我自己去拿(工厂类)

1、创建一个水果接口

/** 
 * 描述:商店 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-23 下午5:07:28

*/ public interface Fruits { /** * 描述 */ public void describe(); }

2、创建苹果

/** 
 * 描述: 苹果

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-23 下午5:06:39

*/ public class Apple implements Fruits { public void describe() { System.out.println("我是苹果"); }; }

3、创建香蕉

/** 
 * 描述: 香蕉

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-23 下午5:12:23

*/ public class Banana implements Fruits { public void describe() { System.out.println("我是香蕉"); } }

4、创建工厂类

/** 
 * 描述: 水果工厂

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-23 下午5:15:30

*/ public class FruitsFactory { /** * 获取苹果 * @return Apple */ public static Apple createApple(){ return new Apple(); } /** * 获取香蕉 * @return Banana */ public static Banana createBanana(){ return new Banana(); } }

5、测试类

/** 
 * 描述:测试类 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-23 下午5:18:29

*/ public class Test { public static void main(String[] args) { Apple apple = FruitsFactory.createApple(); apple.describe(); Banana banana = FruitsFactory.createBanana(); banana.describe(); } }

6、结果

B、工厂模式

我去商店想要买水果,跟老板(工厂类)指定水果名称,老板就会给我我想要的对象,水果

1、创建一个水果描述的接口

/** 
 * 描述:水果 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-22 上午10:09:33

*/ public interface Fruits { /** * 描述 */ public void describe(); }

2、创建水果对应的对象并实现水果的接口

/** 
 * 描述:苹果 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-22 上午10:11:12

*/ public class Apple implements Fruits { public void describe() { System.out.println("我是苹果"); } }

/** 
 * 描述:香蕉 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-22 上午10:14:51

*/ public class Banana implements Fruits { public void describe() { System.out.println("我是香蕉"); } }

3、创建水果工厂

/** 
 * 描述:水果工厂 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-22 上午10:19:21

*/ public class FruitsFactory { /** * 购买水果 * @param name * @return Shop */ public Fruits purchaseFruits(String name){ if("Apple".equals(name)){ // 苹果 return new Apple(); }else if("Banana".equals(name)){ // 香蕉 return new Banana(); } return null; } }

4、编写测试类

/** 
 * 描述:测试类 

* 作者: kimball

* E-mail: kimballlu@foxmail.com

* 日期:2016-11-22 上午10:27:50

*/ public class Test { public static void main(String[] args) { FruitsFactory factory = new FruitsFactory(); Fruits apple = factory.purchaseFruits("Apple"); apple.describe(); Fruits banana = factory.purchaseFruits("Banana"); banana.describe(); } }

5、输出结果


C、抽象工厂模式


还是以水果为例子

1、因为苹果还分红苹果和青苹果等等,所以创建苹果抽象类

/** 
 * 描述:苹果抽象类 
* 作者: kimball
* E-mail: kimballlu@foxmail.com
* 日期:2016年12月6日 下午6:03:27
*/ public abstract class FruitsApple { /** * 描述 */ public abstract void describe(); }

2、创建苹果类

/** 
 * 描述:苹果 
* 作者: kimball
* E-mail: kimballlu@foxmail.com
* 日期:2016年12月6日 下午6:04:36
*/ public class Apple extends FruitsApple { @Override public void describe() { System.out.println("我是苹果"); } }

3、同样,香蕉也是分很多种,创建香蕉抽象类

/** 
 * 描述:香蕉抽象类 
* 作者: kimball
* E-mail: kimballlu@foxmail.com
* 日期:2016年12月6日 下午6:09:32
*/ public abstract class FruitsBanana { /** * 描述 */ public abstract void describe(); }

4、创建香蕉

/** 
 * 描述:香蕉 
* 作者: kimball
* E-mail: kimballlu@foxmail.com
* 日期:2016年12月6日 下午6:10:16
*/ public class Banana extends FruitsBanana { @Override public void describe() { System.out.println("我是香蕉"); } }

5、创建商人工厂类

作者:kimball
链接:https://zhuanlan.zhihu.com/p/23853924
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

/** 
 * 描述:商人类,通过反射实现抽象工厂 
* 作者: kimball
* E-mail: kimballlu@foxmail.com
* 日期:2016年12月6日 下午6:10:54
*/ public class BusinessmanAbstractFactory { /** * 创建苹果 * @param name 指定创建的苹果类路径 * @return FruitsApple * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException */ public static FruitsApple createApple(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ if("".equals(name) || name == null){ return null; } return (FruitsApple) Class.forName(name).newInstance(); } /** * 创建香蕉 * @param name 指定创建的香蕉类路径 * @return FruitsBanana * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException */ public static FruitsBanana createBanana(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ if("".equals(name) || name == null){ return null; } return (FruitsBanana) Class.forName(name).newInstance(); } }

6、创建测试类

/** 
 * 描述:测试类 
* 作者: kimball
* E-mail: kimballlu@foxmail.com
* 日期:2016年12月6日 下午6:19:48
*/ public class Test { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { FruitsApple apple = BusinessmanAbstractFactory.createApple("com.newtt.Apple"); apple.describe(); FruitsBanana banana = BusinessmanAbstractFactory.createBanana("com.newtt.Banana"); banana.describe(); } }

7、运行结果

三、结语

工厂模式用的很多,给我最大的感觉就是扩展方便

虽然代码是多了点儿,解释少了点儿。但是没事儿,谁让我文笔不好呢?用我妈的一句话就是“让你好好读书,你不听,偏要去放牛”

毕竟我也是菜鸟+小白,要是有写的不好的地方,你还能顺着网线过来打我不成?

这文章写的够久了,两周前写了一半,现在才写完。都怪那个客户,改需求改需求,每次当客户刘总背朝着我,就有种冲动狠狠的踹上一脚,并大声破骂,让你**的改需求,改需求