抽象工厂模式:
1.简单工厂模式在实际中并不实用且缺点较明显。
2.工厂方法模式解决了简单工厂不能实现“开闭原则”的弊端,但是代码会比较冗余。
3.抽象工厂模式:Provide an interface for creating families of related or dependent objects without specifying their concrete classes。
抽象的产品:手机和充电器
//产品类(手机) public interface Mobile { String getName(); } //产品类(充电器) public interface Charger { String getName(); }
public class AppleMobile implements Mobile { private String name; public AppleMobile() { name = "苹果手机"; System.out.println("Apple手机生产完毕!"); } @Override public String getName() { return name != null ? name : null; } }
public class HuaweiMobile implements Mobile { private String name; public HuaweiMobile() { name = "华为手机"; System.out.println("华为手机生产完毕!"); } @Override public String getName() { return name != null ? name : null; } }
手机和充电器:两个具体的品牌
public class AppleCharger implements Charger { private String name; public AppleCharger() { name = "苹果手机充电器"; System.out.println("Apple手机充电器生产完毕!"); } @Override public String getName() { return name != null ? name : null; } } //+++++++++++++++++++++++++++++++ public class HuaweiCharger implements Charger { private String name; public HuaweiCharger() { name = "华为充电器"; System.out.println("华为手机充电器生产完毕!"); } @Override public String getName() { return name != null ? name : null; } }
已经有了产品样本,现在需要工厂去生产。
需要对工厂进行抽象:
public interface MobileFactory { // 生产手机 Mobile getMobile(); // 生产充电器 Charger getCharger(); }
创建具体的工厂
public class AppleFactory implements MobileFactory { // 生产苹果手机 @Override public Mobile getMobile() { return new AppleMobile(); } // 生产苹果手机充电器 @Override public Charger getCharger() { return new AppleCharger(); } }
public class HuaweiFactory implements MobileFactory { // 生产华为手机 @Override public Mobile getMobile() { return new HuaweiMobile(); } // 生产华为手机充电器 @Override public Charger getCharger() { return new HuaweiCharger(); } }
测试使用工厂类:
public class Test { public static void main(String[] args) { AppleFactory appleFactory = new AppleFactory(); AppleMobile appleMobile = (AppleMobile) appleFactory.getMobile(); AppleCharger appleCharger = (AppleCharger) appleFactory.getCharger(); HuaweiFactory huaweiFactory = new HuaweiFactory(); HuaweiMobile huaweiMobile = (HuaweiMobile) huaweiFactory.getMobile(); HuaweiCharger huaweiCharger = (HuaweiCharger) huaweiFactory.getCharger(); } }
总结:
1.对产品进行抽象
2.对工厂进行抽象
3.具体的产品实现抽象的产品接口
4.具体的工厂实现抽象工厂
5.按需创建想要的class