设计模式——工厂方法模式

一 为什么要工厂方法模式

1.1 简单工厂模式代码

经过上一篇博文对简单工厂的分析,已经体会到简单工厂所带来的遍历之处,依然考虑上一篇博文的例子:一个学生类,一个铅笔类,一个橡皮类,每名学生需要一支铅笔,一个橡皮:

public abstract class Stationery {
	public Stationery(){
		
	}
}

public class Eraser extends Stationery {
	public Eraser(){
		System.out.println("制造橡皮");
	}
}
public class Pencil extends Stationery {
	public Pencil(){
		System.out.println("制造铅笔");
	}
}

public class Factory {
	public Stationery createStationery(String type){
		switch (type) {
		case "pencil":
			return new Pencil();
		case "eraser":
			return new Eraser();
		default:
			break;
		}
		return null;
	}
}
public class Student {
	public static void main(String[] args){
		Factory factory=new Factory();
		
		Stationery pencil1=factory.createStationery("pencil");
		Stationery eraser1=factory.createStationery("eraser");
	}
}


1.2 需求改变

现在学生长大了,除了铅笔盒橡皮还需要一支钢笔,修改代码如下:

(1)加入pen类

public class Pen extends Stationery{
	public Pen(){
		System.out.println("制造钢笔");
	}
}

(2)修改工厂方法

public class Factory {
	public Stationery createStationery(String type){
		switch (type) {
		case "pencil":
			return new Pencil();
		case "eraser":
			return new Eraser();
		case "pen":               //step2
			return new Pen();
		default:
			break;
		}
		return null;
	}
}


(3)制造钢笔

public class Student {
	public static void main(String[] args){
		Factory factory=new Factory();
		
		Stationery pencil1=factory.createStationery("pencil");
		Stationery eraser1=factory.createStationery("eraser");
		Stationery pen1=factory.createStationery("pen");
	}
}

重点关注第二步,修改工厂方法,这明显不满足开放关闭原则,并且一个工厂既可以生产钢笔,又可以生产铅笔。。。显然不满足单一职责原则,看一下工厂方法模式:

二 工厂方法模式

2.1 原始的工厂方法模式

public abstract class Stationery {
	public Stationery(){
		
	}
}
public class Eraser extends Stationery {
	public Eraser(){
		System.out.println("制造一块橡皮");
	}
}
public class Pencil extends Stationery {
	public Pencil(){
		System.out.println("制造一支铅笔");
	}
}
public interface FactoryStationery {
	Stationery createStationery();
}
public class FactoryEraser implements FactoryStationery {
	@Override
	public Eraser createStationery() {
		return new Eraser();
	}
}
public class FactoryPencil implements FactoryStationery {
	@Override
	public Pencil createStationery() {
		return new Pencil();
	}
}
public class Student {
	public static void main(String[] args){
		FactoryPencil factoryPencil=new FactoryPencil();
		FactoryEraser factoryEraser=new FactoryEraser();
		
		Pencil pencil1=factoryPencil.createStationery();
		Eraser eraser1=factoryEraser.createStationery();
	}
}

直观上来看把工厂分离开了,各个工厂生产自己的物品,互不干涉。

2.2 需求改变之后

与上述相同,现在需要加入一支钢笔:

(1)加入pen类

public class Pen extends Stationery{
	public Pen(){
		System.out.println("制造钢笔");
	}
}
(2)加入pen的工厂

public class FactoryPen implements FactoryStationery {

	@Override
	public Pen createStationery() {
		return new Pen();
	}
}
(3)制造钢笔

public class Student {
	public static void main(String[] args){
		FactoryPencil factoryPencil=new FactoryPencil();
		FactoryEraser factoryEraser=new FactoryEraser();
		FactoryPen factoryPen=new FactoryPen();
		
		Pencil pencil1=factoryPencil.createStationery();
		Eraser eraser1=factoryEraser.createStationery();
		Pen pen1=factoryPen.createStationery();
	}
}

三 总结

3.1 分析

从上述过程可以看出,工厂方法将不同物品的工厂剥离出来,当加入新物品时,不用修改工厂,而是建立自己的工厂,实现了开放关闭原则和单一职责原则。

3.2 UML图


备注:个人见解,不一定正确!

3.3 工厂方法缺点

工厂方法缺点和不足见下一遍博客和抽象工厂一起分析。















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值