设计模式--Simple Factory

注:这里的设计模式引用自林信良java 学习笔记。相关内容属于原作者所有,这里只是为了学习,进行转载和相应小修改。

Simple Factory 模式又称为 Static Factory,使用 SimpleFactory 来制造产品对客户端隐藏产品制造细节。实现时定义一个产品的 Interface , 通过静态方法来制造产品。

SimpleFactory 的类图如下所示:


客户(Client) 只面对 Factory, 客户依赖于产品的接口(interface), 这样就将产品的具体实现与客户隔离开了。

举例,假设有一个音乐盒工厂,客户不用知道某种音乐盒如何制造,他只要知道如何播放音乐就可以了,类图如下所示:


上图中 MusicBoxDemo 代表客户,他只依赖于音乐盒接口 IMusicBox, 他不关心具体的音乐盒实现类,具体产生何种的音乐盒实现由工厂类 MusicBoxFactory 完成。

IMusicBox

Java代码 复制代码
  1. package org.lokvin.example.designpattern.simplefactory;   
  2.   
  3. /**  
  4.  * IMusicBox 产品接口  
  5.  * @author lokvin  
  6.  *  
  7.  */  
  8. public interface IMusicBox {   
  9.     public void play();   
  10.   
  11. }  
package org.lokvin.example.designpattern.simplefactory;

/**
 * IMusicBox 产品接口
 * @author lokvin
 *
 */
public interface IMusicBox {
	public void play();

}



PianoBox

Java代码 复制代码
  1. package org.lokvin.example.designpattern.simplefactory;   
  2.   
  3. /**  
  4.  * PianoBox 产品,实现 IMusicBox 接口  
  5.  * @author lokvin  
  6.  *  
  7.  */  
  8. public class PianoBox implements IMusicBox {   
  9.   
  10.     public void play() {   
  11.         System.out.println("播放钢琴音乐 ;)");   
  12.     }   
  13.        
  14.   
  15. }  
package org.lokvin.example.designpattern.simplefactory;

/**
 * PianoBox 产品,实现 IMusicBox 接口
 * @author lokvin
 *
 */
public class PianoBox implements IMusicBox {

	public void play() {
		System.out.println("播放钢琴音乐 ;)");
	}
	

}



ViolinBox

Java代码 复制代码
  1. package org.lokvin.example.designpattern.simplefactory;   
  2.   
  3. /**  
  4.  * ViolinBox 产品,实现 IMusicBox 接口  
  5.  * @author lokvin  
  6.  *  
  7.  */  
  8. public class ViolinBox implements IMusicBox {   
  9.   
  10.     public void play() {   
  11.         System.out.println("播放小提琴音乐 ^_^");   
  12.            
  13.     }   
  14.        
  15.   
  16. }  
package org.lokvin.example.designpattern.simplefactory;

/**
 * ViolinBox 产品,实现 IMusicBox 接口
 * @author lokvin
 *
 */
public class ViolinBox implements IMusicBox {

	public void play() {
		System.out.println("播放小提琴音乐 ^_^");
		
	}
	

}



MusicBoxFactory

Java代码 复制代码
  1. package org.lokvin.example.designpattern.simplefactory;   
  2.   
  3. /**  
  4.  * MusicBoxFactory 音乐盒工厂类,通过方法 createMusicBox()   
  5.  * 制造音乐盒,返回 IMusicBox 对象  
  6.  * @author lokvin  
  7.  *  
  8.  */  
  9. public class MusicBoxFactory {   
  10.     public static IMusicBox createMusicBox(String name)    
  11.         throws InstantiationException, IllegalAccessException, ClassNotFoundException {   
  12.            
  13.         return (IMusicBox)Class.forName(name).newInstance();   
  14.     }   
  15.   
  16. }  
package org.lokvin.example.designpattern.simplefactory;

/**
 * MusicBoxFactory 音乐盒工厂类,通过方法 createMusicBox() 
 * 制造音乐盒,返回 IMusicBox 对象
 * @author lokvin
 *
 */
public class MusicBoxFactory {
	public static IMusicBox createMusicBox(String name) 
		throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		
		return (IMusicBox)Class.forName(name).newInstance();
	}

}



MusicBoxDemo

Java代码 复制代码
  1. package org.lokvin.example.designpattern.simplefactory;   
  2.   
  3. /**  
  4.  * MusicBoxDemo 是使用音乐盒的客户类  
  5.  * 他只依赖于 IMusicBox 接口  
  6.  * @author lokvin  
  7.  *  
  8.  */  
  9. public class MusicBoxDemo {   
  10.     /*  
  11.      * 播放音乐方法  
  12.      */  
  13.     public static void playMusicBox(IMusicBox box) {   
  14.         box.play();   
  15.     }   
  16.        
  17.     public static void main(String[] args) throws Exception {   
  18.         playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.PianoBox"));   
  19.         playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.ViolinBox"));   
  20.     }   
  21.   
  22. }  
package org.lokvin.example.designpattern.simplefactory;

/**
 * MusicBoxDemo 是使用音乐盒的客户类
 * 他只依赖于 IMusicBox 接口
 * @author lokvin
 *
 */
public class MusicBoxDemo {
	/*
	 * 播放音乐方法
	 */
	public static void playMusicBox(IMusicBox box) {
		box.play();
	}
	
	public static void main(String[] args) throws Exception {
		playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.PianoBox"));
		playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.ViolinBox"));
	}

}



题外话:这里的 UML 类图采用 viso 绘制,感觉不是很方便,不知有没有更小巧方便的工具。林信良老师的教学文章写的非常细致,十分欣赏佩服。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值