设计模式:抽象工厂模式
- 抽象工厂模式简介:
- 简介:抽象工厂模式是一种创建型模式,围绕一个超级工厂创建其他工厂。
- 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类
- 主要解决: 解决接口选择问题
- 使用场景: 系统的产品有多余一个的产品族,而系统只消灭其中某一族的产品。
- 抽象工厂模式成分
- 产品族A,B接口
- 产品族A,B的实现
- 工厂抽象方法:包含获取两个产品族的方法
- 获取不同产品族的工厂实现
- 工厂生成器
- 抽象工厂优缺点
- 优点:
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
- 缺点:
- 产品族扩展非常困难,要增加一个系列的某个产品,既要在抽象的creator里加代码,又要在具体的里面加代码
- 优点:
- 抽象工厂模式实现
- 产品族的抽象
package com.fg.java.factory; public interface Person { public void sayName(); }
package com.fg.java.factory; /** * 枪的抽象类 */ public interface Gun { public void SayName(); }
- 产品族的实现
Person:package com.fg.java.factory; public class HaoTianPerson implements Person { public void sayName() { System.out.println("my name is HaoTian"); } }
package com.fg.java.factory; public class WangMuPerson implements Person { public void sayName() { System.out.println("My name is WangMu"); } }
Gun:
package com.fg.java.factory; public class M416 implements Gun { public void SayName() { System.out.println("I`m M416"); } }
package com.fg.java.factory; public class UZI implements Gun { public void SayName() { System.out.println("I`m UZI"); } }
- 产品工厂抽象
package com.fg.java.factory; public abstract class AbstractFactory { public abstract Gun getGun(String gun); public abstract Person getPerson(String peson); }
- 产品工厂实现
PersonFactory:package com.fg.java.factory; public class PersonFactory extends AbstractFactory{ @Override public Person getPerson(String peson) { if(peson == null){ return null; } if("HaoTian".equalsIgnoreCase(peson)){ return new HaoTianPerson(); } else if("WangMu".equalsIgnoreCase(peson)){ return new WangMuPerson(); } return null; } @Override public Gun getGun(String gun) { return null; } }
GunFacotory:
package com.fg.java.factory; public class GunFactory extends AbstractFactory{ @Override public Gun getGun(String gun) { if(gun == null){ return null; } if("M416".equalsIgnoreCase(gun)){ return new M416(); }else if("UZI".equalsIgnoreCase(gun)){ return new UZI(); } return null; } @Override public Person getPerson(String peson) { return null; } }
- 生产者
工厂实现:package com.fg.java.factory; public class FactoryProducer { public static AbstractFactory getFactory(String choice){ if("GUN".equalsIgnoreCase(choice)){ return new GunFactory(); }else if("Person".equalsIgnoreCase(choice)){ return new PersonFactory(); } return null; } }
- 产品族的抽象