简单的简单工厂模式

简单工厂模式

​ Static Factory Method:属于创建型模式的一种,又可以被称为静态工厂方法模式,但是不属于GoF23种设计模式之一。

结构

​ 对于简单工厂模式的结构,给出一个简易的UML类图:
简单工厂模式类图
​ 从图片中,可以知道简单工厂模式的组成分为三个部分:

  • 第一个也就是工厂啦,简单工厂模式说到底也是一个工厂模式嘛,工厂自然是必不可少的。
  • 第二个则是一个抽象类(当然,也可以设计成一个接口),这是一个对于所有工厂可以生产的东西的一个抽象。
  • 第三个则是具体的实现类了,也是上图中的产品1,产品2,产品…代表的也是实实在在的需要被工厂所生成的事物对象。
举例说明
  1. 第一个例子用比较贴近图像上所绘制的表达效果:比如有一家电脑制造商,这一家电脑制造商呢原先只制作一种牌子A牌的电脑,后来发现B牌比较火,然后急忙制作B牌的电脑,后来陆陆续续加上了C牌的,D牌的,等等。

    这里的电脑制造商——工厂类,而电脑——抽象产品类,各种品牌的电脑——各种产品类啦,

  2. 第二个例子再进一步提升一下:比如计算器,计算器是用于计算的,计算可以分为加减乘除,平方,开根号啊登等。

    这里的计算器——工厂类,而计算方式——抽象产品类,加减乘除什么的——各种实际的产品类啦。

注意
  1. 虽然使用到简单工厂模式的位置比较多,简单工厂模式也正是突出了简单二字,小小的一个模式就体现处了面向对象的的三大特性——封装,继承,多态。但是简单工厂模式的主要核心就在工厂类里面,而且在定义好了之后,如果需要新增工厂中的产品那么是需要进行源代码的修改的,这违背了开闭原则同时使得代码具有高内聚的特性。
  2. 所以使用简单工厂模式的场景,首先一点就和它自己的名字相当,要求是一个比较简单的场景,其次,不关注具体的实现细节,用户所需要的就是传入内定好的各种标志或者其他什么规范数据,给到用户自身想要的产品即可。
一个小DEMO
  1. 场景

    不涉及太复杂的场景,直接通过上面的类图来定义,主要有一个工厂可以生成几种不同的产品。

  2. 紧接着定义抽象类

    package com.factory.simple;
    /**
     * 简单工厂模式——抽象类
     * @author WQ
     */
    public abstract class ProductAbstract {
    	/**
    	 * 简单的定义一个方法,用于后面测试多态性
    	 */
    	public abstract void show();
    }
    
  3. 定义具体的产品类

    package com.factory.simple;
    /**
     * 简单工厂模式——实际产品类A
     * @author WQ
     */
    public class ProductA extends ProductAbstract{
    	@Override
    	public void show() {
    		System.out.println("Created a product called ProductA!");
    	}
    }
    //--------------------------------------------------------------------
    package com.factory.simple;
    /**
     * 简单工厂模式——实际产品类B
     * @author WQ
     */
    public class ProductB extends ProductAbstract{
    	@Override
    	public void show() {
    		System.out.println("Created a product called ProductB!");
    	}
    }
    
  4. 最后定义好工厂类(用if-else分支还是switch都是可以的)

    package com.factory.simple;
    /**
     * 简单工厂模式——工厂类
     * @author WQ
     */
    public class Factory {
    	/**
    	 * 创建具体产品的方法,用户只需要调用这个方法就可以了
    	 * @param productName
    	 * @return
    	 */
    	public ProductAbstract getProduct(String productType) {
    		if (productType.equalsIgnoreCase("A")) {
    			return new ProductA();
    		}else if (productType.equalsIgnoreCase("B")) {
    			return new ProductB();
    		}else {
    			return null;
    		}
    	}
    }
    
  5. 紧接着来一波测试

    package com.factory.simple;
    /**
     * 简单工厂模式——测试类
     * @author WQ
     */
    public class Main {
    	public static void main(String[] args) {
    		// 创建工厂类
    		Factory factory = new Factory();
    		// 通过工厂创建具体的产品
    		ProductAbstract productA = factory.getProduct("A");
    		productA.show();
    		ProductAbstract productB = factory.getProduct("B");
    		productB.show();
    	}
    }
    
  6. 测试结果输出

    Created a product called ProductA!
    Created a product called ProductB!
    

完成!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值