设计模式之四 抽象工厂模式

来源:互联网 发布:shell执行sql脚本 编辑:程序博客网 时间:2024/05/17 23:35

大家好,现在咱们来讨论一下抽象工厂模式吧。还是以我之前给的例子(详情可以看之前的简单工厂)但是现在要做出一点假设:

假设 苹果公司和小米公司都有生产 Phone,MP3之类的...(纯粹是为了方便说明)

好了,现在说说产品等级结构和产品族的概念

所谓的产品等级结构:就是指某一类产品的继承结构,比如说电话,它包括IPhone电话和XiaoMi电话,他们就是属于同一个产品等级结构

所谓的产品族:就是指处于不同产品等级结构的一组产品,且是由同一个工厂产生的。比如说 Apple公司既可以生产IPhone,也可以生产IPOD,而小米公司既可以生产XiaoMi手机,也可以生产XiaoMiPod(假设...)

好了,现在让我们来看看UML图吧:


现在看看代码吧

package edu.fjnu.cs.hwb.abstractfactory;public interface Phone{void call(); }

package edu.fjnu.cs.hwb.abstractfactory;public interface Pod {void play();}

package edu.fjnu.cs.hwb.abstractfactory;public interface AbstractFactory{Phone getPhone(String name);Pod getPod(String name);}

现在看看具体的实现类吧

首先是Apple公司的产品

package edu.fjnu.cs.hwb.abstractfactory;public class IPhone4 implements Phone {@Overridepublic void call(){System.out.println("this is IPhone4");}}
package edu.fjnu.cs.hwb.abstractfactory;public class IPhone4s implements Phone{@Overridepublic void call(){System.out.println("this is IPhone4s");}}
package edu.fjnu.cs.hwb.abstractfactory;public class IPod1 implements Pod {@Overridepublic void play() {System.out.println("this is IPod1");}}
package edu.fjnu.cs.hwb.abstractfactory;public class IPod2 implements Pod {@Overridepublic void play() {System.out.println("this is IPod2");}}

现在看看小米公司的:

package edu.fjnu.cs.hwb.abstractfactory; public class XiaoMi2 implements Phone{@Overridepublic void call(){System.out.println("this is XiaoMi2");}}
package edu.fjnu.cs.hwb.abstractfactory;public class XiaoMi2S implements Phone {@Overridepublic void call() {System.out.println("this is XiaoMi2S");}}
package edu.fjnu.cs.hwb.abstractfactory;public class XiaoMiPod1 implements Pod{@Overridepublic void play(){System.out.println("this is XiaoMiPod1");}}
package edu.fjnu.cs.hwb.abstractfactory;public class XiaoMiPod2 implements Pod {@Overridepublic void play() {System.out.println("this is XiaoMiPod2");}}


好了,看看对应的工厂吧。首先是苹果公司的:

package edu.fjnu.cs.hwb.abstractfactory;public class AppleFactory implements AbstractFactory {@Overridepublic Phone getPhone(String name) {if ("IPhone4".equalsIgnoreCase(name))return new IPhone4();else if ("IPhone4s".equalsIgnoreCase(name))return new IPhone4s();return null;}@Overridepublic Pod getPod(String name) {if ("IPod1".equalsIgnoreCase(name))return new IPod1();else if ("IPod2".equalsIgnoreCase(name))return new IPod2();return null;}}

之后是小米公司的:

package edu.fjnu.cs.hwb.abstractfactory;public class XiaoMiFactory implements AbstractFactory {@Overridepublic Phone getPhone(String name){if ("XiaoMi2".equalsIgnoreCase(name))return new XiaoMi2();else if ("XiaoMi2s".equalsIgnoreCase(name))return new XiaoMi2S();return null;}@Overridepublic Pod getPod(String name){if ("XiaoMiPod1".equalsIgnoreCase(name))return new XiaoMiPod1();else if ("XiaoMiPod2".equalsIgnoreCase(name))return new XiaoMiPod2();return null;}}
看看客户端程序员怎么使用:

package edu.fjnu.cs.hwb.abstractfactory;public class Client {public static void main(String[] args){AbstractFactory abstractFactory = new AppleFactory();Phone phone = abstractFactory.getPhone("Iphone4");phone.call();phone = abstractFactory.getPhone("Iphone4s");phone.call();Pod pod = abstractFactory.getPod("Ipod1");pod.play();pod = abstractFactory.getPod("Ipod2");pod.play();System.out.println();abstractFactory = new XiaoMiFactory();phone = abstractFactory.getPhone("XiaoMi2");phone.call();phone = abstractFactory.getPhone("XiaoMi2s");phone.call();pod = abstractFactory.getPod("XiaoMiPod1");pod.play();pod = abstractFactory.getPod("XiaoMiPod2");pod.play();}}
结果如下:





好了..代码虽然多,但是很简单的..

如果有错误,希望大家指正出来


0 0
原创粉丝点击