设计模式——抽象工厂(Abstract Factory Pattern)
2015-01-05 22:27
274 查看
抽象工厂:
当你的汽车公司做到一定程度后,公司开始为土豪们做私人订制一些系列车型!比如说、中国土豪私人订制的要求是一家三口都要不同样式的汽车,孩子要酷炫式、母亲要青春式、父亲要高贵式!当方案一推出英国和日本的土豪们都很欣赏很想要类似的私人定制,公司响应他们的要求作出了整体的汽车设计方案,汽车的设计方案如下(图中为了方便省略了日本):
汽车设计方案UML类图
为了生产该方案的汽车,公司对各地的汽车工厂生产模式做了对应的调研,提出两种修改方案:
一、为每个产品方案创建一个Factory层次类(及工厂模型),如ChildCarFactory生产ChineseChildCar和EnglishChildCar。这种方法可行但为每个地域创建私人订制需要多个Factory层次类,而且工厂类太多(不考虑某地到某地的运费等),比较麻烦!
二、以上3个层次类图具有相同的结构,可以改造工厂方式模式,让一个工厂层次类就可以负担的起创建3组产品对象的责任,如ChineseFactory生产ChineseChildCar、ChineseMatherCar和ChineseFatherCar。这样不但减少了Factory层次类的个数,而且每个地域的私人订制只需要一个Factory层次类(即本地工厂)就能满足需求,比较方便。
第二种方案就是抽象工厂!上述对应的工厂方案设计如下:
工厂的UML类图
然后,将工厂和汽车关联起来的类图如下:
工厂模式的UML类图
抽象工厂类代码:
ChineseChildCar
ChineseMatherCar
ChineseFatherCar
EnglishChildCar
EnglishMatherCar
EnglishFatherCar
抽象工厂的运用场景:
当客户对象要从一个相关的产品组中创建一个对象,而没有必要知道到底创建哪个对象时,可以应用抽象工厂模式
抽象工厂的优缺点:
优点:
1、可以产生一系列的产品实例
2、产生新系列产品很方便扩展性很好,只需要实现对应的产品接口和工厂接口就能轻松实现系列扩充,符合开闭原则
缺点:
添加新产品改动较大,如添加一个新产品XXCar就要改动CarFactory接口不符合开闭原则
当你的汽车公司做到一定程度后,公司开始为土豪们做私人订制一些系列车型!比如说、中国土豪私人订制的要求是一家三口都要不同样式的汽车,孩子要酷炫式、母亲要青春式、父亲要高贵式!当方案一推出英国和日本的土豪们都很欣赏很想要类似的私人定制,公司响应他们的要求作出了整体的汽车设计方案,汽车的设计方案如下(图中为了方便省略了日本):
汽车设计方案UML类图
为了生产该方案的汽车,公司对各地的汽车工厂生产模式做了对应的调研,提出两种修改方案:
一、为每个产品方案创建一个Factory层次类(及工厂模型),如ChildCarFactory生产ChineseChildCar和EnglishChildCar。这种方法可行但为每个地域创建私人订制需要多个Factory层次类,而且工厂类太多(不考虑某地到某地的运费等),比较麻烦!
二、以上3个层次类图具有相同的结构,可以改造工厂方式模式,让一个工厂层次类就可以负担的起创建3组产品对象的责任,如ChineseFactory生产ChineseChildCar、ChineseMatherCar和ChineseFatherCar。这样不但减少了Factory层次类的个数,而且每个地域的私人订制只需要一个Factory层次类(即本地工厂)就能满足需求,比较方便。
第二种方案就是抽象工厂!上述对应的工厂方案设计如下:
工厂的UML类图
然后,将工厂和汽车关联起来的类图如下:
工厂模式的UML类图
抽象工厂类代码:
public interface CarFactory {//工厂接口 public ChildCar getChildCar(); public MatherCar getMatherCar(); public FatherCar getFatherCar(); } public interface ChildCar {//ChildCar接口 public String getCarType(); } public interface FatherCar {//FatherCar接口 public String getCarType(); } public interface MatherCar {//MatherCar接口 public String getCarType(); } public class ChineseCarFactory implements CarFactory {//CarFactory的实例工厂ChineseCarFactory public ChildCar getChildCar() { return new ChineseChildCar(); } public MatherCar getMatherCar() { return new ChineseMatherCar(); } public FatherCar getFatherCar() { return new ChineseFatherCar(); } } public class ChineseChildCar implements ChildCar {//中国式ChildCar的实现 下同 public String getCarType() { return "ChineseChildCar"; } } public class ChineseFatherCar implements FatherCar { public String getCarType() { return "ChineseFatherCar"; } } public class ChineseMatherCar implements MatherCar { public String getCarType() { return "ChineseMatherCar"; } } public class EnglishCarFactory implements CarFactory {//CarFactory的实例工厂EnglishCarFactory public ChildCar getChildCar() { return new EnglishChildCar(); } public MatherCar getMatherCar() { return new EnglishMatherCar(); } public FatherCar getFatherCar() { return new EnglishFatherCar(); } } public class EnglishChildCar implements ChildCar {//英国式ChildCar的实现 下同 public String getCarType() { return "EnglishChildCar"; } } public class EnglishFatherCar implements FatherCar { public String getCarType() { return "EnglishFatherCar"; } } public class EnglishMatherCar implements MatherCar { public String getCarType() { return "EnglishMatherCar"; } }测试类:
public class Client { public static void main(String[] args) { CarFactory fa; ChildCar childCar; MatherCar matherCar; FatherCar fatherCar; fa = new ChineseCarFactory(); childCar = fa.getChildCar(); matherCar = fa.getMatherCar(); fatherCar = fa.getFatherCar(); System.out.println(childCar.getCarType() + "\n" + matherCar.getCarType() + "\n" + fatherCar.getCarType() + "\n"); fa = new EnglishCarFactory(); childCar = fa.getChildCar(); matherCar = fa.getMatherCar(); fatherCar = fa.getFatherCar(); System.out.println(childCar.getCarType() + "\n" + matherCar.getCarType() + "\n" + fatherCar.getCarType() + "\n"); } }运行结果:
ChineseChildCar
ChineseMatherCar
ChineseFatherCar
EnglishChildCar
EnglishMatherCar
EnglishFatherCar
抽象工厂的运用场景:
当客户对象要从一个相关的产品组中创建一个对象,而没有必要知道到底创建哪个对象时,可以应用抽象工厂模式
抽象工厂的优缺点:
优点:
1、可以产生一系列的产品实例
2、产生新系列产品很方便扩展性很好,只需要实现对应的产品接口和工厂接口就能轻松实现系列扩充,符合开闭原则
缺点:
添加新产品改动较大,如添加一个新产品XXCar就要改动CarFactory接口不符合开闭原则
相关文章推荐
- 设计模式 抽象工厂(Abstract Factory Pattern)转载
- 抽象工厂设计模式(Abstract Factory Design Pattern)
- 设计模式 抽象工厂(Abstract Factory Pattern)
- 设计模式【抽象工厂Abstract Factory Pattern】
- VB.net设计模式之工厂方法,抽象工厂方法(Factory Method Pattern,Abstract Factory Method Pattern)
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 解读设计模式----抽象工厂模式(AbstractFactory Pattern)
- C#设计模式(6)-Abstract Factory Pattern
- [创建型模式系列]Abstract factory of Design Pattern模式设计之抽象工厂模式
- 设计模式 - Abstract Factory Pattern(抽象工厂模式)
- C#设计模式(6)-Abstract Factory Pattern
- 设计模式 - Abstract Factory Pattern(抽象工厂模式)
- 设计模式3:Abstract Factory Pattern(抽象工厂模式)
- 设计模式——抽象工厂模式【Abstract Factory Pattern】
- C#设计模式(6)-Abstract Factory Pattern
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(2) 推荐
- 解读设计模式----抽象工厂模式(AbstractFactory Pattern)
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- C#设计模式(6)-Abstract Factory Pattern
- C#设计模式(6)-Abstract Factory Pattern