AbstractFactory 抽象工厂模式(已补完)
为了跟别人的有所区别,我这里直接就用接口来实现抽象工厂了,毕竟接口也是一个抽象类么。我想尝试用不一样的角度来介绍抽象工厂。
抽象工厂,怎么说呢,我觉得它是一个把代码工业化的模式,对于实现流水线式的功能的程序会更适合一点,但是灵活性不够,不适用于一些小程序。
以下沿用了机器人的例子。
首先要提出一个叫做“系列”的概念来区分跟“类型”区分。
什么叫系列呢? 就是指一个或者多个类型,它们的类型不同,但是他们拥有相同的属性和功能方法,典型的例子就是几种实现了相同的几个接口的类。那么它们就属于一个系列。
比如这里的机器人除了实现Speak打招呼功能,还额外实现了Clean打扫功能。如果Girlfriend也只会Speak和Clean,那么可以说Girlfriend和机器人是属于一个系列的。
但是,Girlfriend事实上还能做一些啪啪啪的事情
,所以这时候它们就不是一个系列的了。
用抽象工厂的好处,就是能很方便的管理同一系列的类别,如果其中一种类别出问题不能用了,可以很方便的就换成另外一种同系列类别,下面就用机器人类来举例:
机器人系列都拥有一下两种功能:Speak和Clean
功能模块接口Speaker:
package com.iteye.bolide74.impl;public interface ISpeaker {public void Speak(String msg);}package com.iteye.bolide74.impl;public interface ICleaner {public void Clean();}package com.iteye.bolide74.impl;public interface IWorkerFactory {public ICleaner getCleaner();public ISpeaker getSpeaker();}package com.iteye.bolide74.action;import com.iteye.bolide74.impl.ICleaner;import com.iteye.bolide74.impl.ISpeaker;import com.iteye.bolide74.impl.IWorkerFactory;public class RobotAFactory implements IWorkerFactory {@Overridepublic ICleaner getCleaner() {return new RobotCleaner();}@Overridepublic ISpeaker getSpeaker() {return new RobotSpeaker();}}package com.iteye.bolide74.tester;import com.iteye.bolide74.action.RobotAFactory;import com.iteye.bolide74.impl.ICleaner;import com.iteye.bolide74.impl.ISpeaker;import com.iteye.bolide74.impl.IWorkerFactory;public class Tester {public static void main(String[] args) {IWorkerFactory workFactory=new RobotAFactory();ICleaner cleaner=workFactory.getCleaner();ISpeaker speaker=workFactory.getSpeaker();cleaner.Clean();speaker.Speak("hello,world!");}}