抽象工厂设计模式
传说中”造人”问题
package com.cloud.model3; public class Demo1 { public static void main(String[] args) { HumanFactory humanFactory = new FemalFactory(); Human human = humanFactory.createWhiteHuman(); human.color(); human.sex(); human.talk(); } } /******************************************** * 对人类的描述 */ interface Human{ public void color(); public void talk(); public void sex(); } abstract class WhiteHuman implements Human{ public void color(){ System.out.println("白色人种..."); } public void talk(){ System.out.println("说话..."); } } abstract class BlackHuman implements Human{ public void color(){ System.out.println("黑色人种..."); } public void talk(){ System.out.println("说话..."); } } class FemalWhiteHuman extends WhiteHuman{ @Override public void sex() { System.out.println("白色人种中男性..."); } } class MaleWhiteHuman extends WhiteHuman{ @Override public void sex() { System.out.println("白色人种中女性..."); } } /***************************************************** * 工厂描述 */ interface HumanFactory{ public Human createWhiteHuman(); public Human createBlackHuman(); } class FemalFactory implements HumanFactory{ /** * 男性:白色人种 */ @Override public Human createWhiteHuman() { return new FemalWhiteHuman(); } /** * 男性:黑色人种 */ @Override public Human createBlackHuman() { return new FemalWhiteHuman(); } } |
抽象工厂概念
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法
经典代码
package com.cloud.model3; public class Demo2 {} abstract class AbstractProduct1{ public void commonMethod(){} public abstract void otherMethod(); } class Product1 extends AbstractProduct1{ @Override public void otherMethod() {} } class Product2 extends AbstractProduct1{ @Override public void otherMethod() {} } abstract class AbstractFactory{ public abstract AbstractProduct1 createProduct1(); } class Factory1 extends AbstractFactory{ @Override public AbstractProduct1 createProduct1() { return new Product1(); } } |
抽象工厂模式使用条件
1.一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。(比如:Intel主板必须使用Intel CPU、Intel芯片组)
4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
抽象工厂模式的优点
分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。
抽象工厂模式的缺点
不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。