设计模式(2)--抽象工厂模式

来源:互联网 发布:迷你led显示屏软件 编辑:程序博客网 时间:2024/06/05 00:25

上一篇工厂方法模式,一个工厂只生产一种产品,比如电池工厂只生产电池不生产别的,摄像头工厂只生产摄像头,不生产别的。

而抽象工厂模式,生产一系列产品,比如:苹果手机工厂,生产苹果电池、苹果屏幕、苹果摄像头等有相同共同点的产品。

也就是说,我们如果需要某个功能,这个功能按照类别不同,他的属性也就不同,比如:报告生成系统,可以生成pdf格式和word格式两种报告格式,如果是需要生成pdf类型报告,就会生成pdf格式的A报告和B报告,如果需要生成word类型报告,就会生成doc格式的A报告和B报告。这里工厂就分为pdf工厂和doc工厂,两个工厂各负责一类具有共同点产品的产出。

抽象工厂模式比工厂方法模式更加抽象,所以他也更加具有一般性。

抽象工厂模式UML类图如图:


手残党在此敲打


代码示例说明:

有Apple手机工厂和Android手机工厂,生产Apple手机屏幕、电池和Android手机屏幕、电池。


实例代码:

抽象产品工厂

public abstract class AbstractProductFactory {public abstract AbstractProductDianchi getProductDianchi();public abstract AbstractProductPingmu getProductPingmu();}

工厂工厂,里面的方法当然是生产产品,生产产品先定下来,至于产品的类被,交给具体工厂确定。


苹果工厂

/***** * 苹果手机工厂 * @author wjw * */public class ProductAppleFactory extends AbstractProductFactory{@Overridepublic AbstractProductDianchi getProductDianchi() {// TODO Auto-generated method stubreturn new AppleProductDianchi();}@Overridepublic AbstractProductPingmu getProductPingmu() {// TODO Auto-generated method stubreturn new AppleProductPingmu();}}

安卓手机工厂:


/***** * 安卓手机工厂 * @author wjw * */public class ProductAndroidFactory extends AbstractProductFactory{@Overridepublic AbstractProductDianchi getProductDianchi() {// TODO Auto-generated method stubreturn new AndroidProductDianchi();}@Overridepublic AbstractProductPingmu getProductPingmu() {// TODO Auto-generated method stubreturn new AndroidProductPingmu();}}


工厂设计好了,开始产品类设计

通过抽象工厂,我们能看出生产电池(Dianchi)和屏幕(Pingmu)两种产品,不知道具体那种产品,所以这两种产品都需要进行一下抽象。

抽象屏幕产品

public abstract class AbstractProductPingmu {public abstract void movie();}

抽象电池产品

public abstract class AbstractProductDianchi {public abstract void discharge();}

具体产品继承抽象产品:

安卓手机屏幕产品:

public class AndroidProductPingmu extends AbstractProductPingmu{@Overridepublic void movie() {// TODO Auto-generated method stubSystem.out.println("安卓屏幕看电影!");}}

安卓手机电池产品:

public class AndroidProductDianchi extends AbstractProductDianchi{@Overridepublic void discharge() {// TODO Auto-generated method stubSystem.out.println("安卓电池供电!");}}


苹果手机屏幕产品:

public class AppleProductPingmu extends AbstractProductPingmu{@Overridepublic void movie() {// TODO Auto-generated method stubSystem.out.println("苹果屏幕看电影");}}

苹果手机电池产品:

public class AppleProductDianchi extends AbstractProductDianchi{@Overridepublic void discharge() {// TODO Auto-generated method stubSystem.out.println("苹果电池供电!");}}


Main类:

public class Main {/** * @param args * @throws ClassNotFoundException  * @throws IllegalAccessException  * @throws InstantiationException  */public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {// TODO Auto-generated method stubClass facrotyClazz = Class.forName(ReadProperties.readProperties("abstract_factory_name"));AbstractProductFactory factory = (AbstractProductFactory)facrotyClazz.newInstance(); AbstractProductDianchi dianchi =factory.getProductDianchi();AbstractProductPingmu pingmu = factory.getProductPingmu();dianchi.discharge();pingmu.movie();}}

运行结果:

苹果电池供电!
苹果屏幕看电影


说明:利用配置文件的配置,说明需要哪一类产品,安卓还是苹果,就可以一次生产一类多个产品。

抽象工厂模式说明:

与工厂方法模式的比较:抽象工厂比工厂方法复杂,复杂在哪里呢?其实,抽象工厂模式里面还有工厂方法模式的影子。比如:我们改成只生产一种产品(如只生产电池,就是只生产安卓电池和苹果电池这两种产品),那写出来的代码就和昨天的工厂方法模式大致一样了,比较UML类图也能比较出来。

所以说,工厂方法模式是抽象工厂模式的一种特殊情况,显然抽象工厂模式更具普遍性,它能达到这个目的,就是要比工厂方法模式更抽象,想达到普适性目的是要付出代价的。上帝最牛逼,但上帝只存在我们大脑里,抽象的存在。

  抽象工厂模式增加产品类很容易,比如诺基亚重新崛起,建了个工厂,生产诺基亚手机的屏幕和电池,很容易,不用修改源代码,扩展类就行。但是!缺点就是如果想再加一个产品,比如,所有工厂想再生产摄像头,那就要修改源代码了。。。这就是传说中的开闭原则倾斜行


如有错误,欢迎指正

end



原创粉丝点击