`
wangpx
  • 浏览: 202457 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

抽象工厂模式读书笔记

阅读更多
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要关心具体实际产出的产品是什么。
总结 :
  1. 所有工厂都是用来封装对象的创建。
  2. 简单工厂,虽然不是真正的设计模式,但是仍然不失为一个简单的方法,可以把客户程序从具体类解耦。
  3. 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
  4. 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法  中。
  5. 所有工厂模式都是通过减少应用程序和具体类之间的依赖关系促进松耦合。
  6. 工厂方法允许类将实例化延迟到子类进行。
  7. 抽象工厂创建相关的家族,而不需要依赖他们的具体类。 
  8. 依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。
  9. 工厂是很有威力的技巧,帮助我们针对抽象编成,而不是针对具体类编成。



package pattern; 

import java.util.ArrayList; 

public abstract class PizzaStore {
 SimplePizzaFactory factory; 

 public PizzaStore() {
 } 

 public PizzaStore(SimplePizzaFactory factory) {
  this.factory = factory;
 } 

 public Pizza orderPizza(String type) {
  Pizza pizza;
  pizza = createPizza(type);
  pizza.prepare();
  pizza.bake();
  pizza.cut();
  pizza.box();
  return pizza;
 } 

 abstract Pizza createPizza(String type);
} 

class NYPizzaStore extends PizzaStore {
 Pizza createPizza(String item) {
  Pizza pizza=null;
  PizzaIngredientFactory ingredientFactory=new NYPizzaIngredientFctory();
  if (item.equals("cheese")) {
   pizza= new CheesePizza(ingredientFactory);
   pizza.setName("New York Style Cheese Pizza");
  } else if (item.equals("pepperoni")) {
   pizza=new PepperoniPizza(ingredientFactory);
   pizza.setName("New York Style pepperoni Pizza");
  } else if (item.equals("clam")) {
   pizza=new ClamPizza(ingredientFactory);
   pizza.setName("New York Style Clame Pizza");
  } else if (item.equals("veggie")) {
   pizza=new VeggiePizza(ingredientFactory);
   pizza.setName("New York Style Veggie Pizza");
  } 
   return pizza;
 }
} 

class ChicagoPizzaStore extends PizzaStore {
 Pizza createPizza(String item) {
  Pizza pizza=null;
  PizzaIngredientFactory ingredientFactory=new NYPizzaIngredientFctory();
  if (item.equals("cheese")) {
   pizza= new CheesePizza(ingredientFactory);
   pizza.setName("New York Style Cheese Pizza");
  } else if (item.equals("pepperoni")) {
   pizza=new PepperoniPizza(ingredientFactory);
   pizza.setName("New York Style pepperoni Pizza");
  } else if (item.equals("clam")) {
   pizza=new ClamPizza(ingredientFactory);
   pizza.setName("New York Style Clame Pizza");
  } else if (item.equals("veggie")) {
   pizza=new VeggiePizza(ingredientFactory);
   pizza.setName("New York Style Veggie Pizza");
  } 
   return pizza;
 }
} 

class CaliforniaPizzaStore extends PizzaStore {
 Pizza createPizza(String item) {
  Pizza pizza=null;
  PizzaIngredientFactory ingredientFactory=new NYPizzaIngredientFctory();
  if (item.equals("cheese")) {
   pizza= new CheesePizza(ingredientFactory);
   pizza.setName("New York Style Cheese Pizza");
  } else if (item.equals("pepperoni")) {
   pizza=new PepperoniPizza(ingredientFactory);
   pizza.setName("New York Style pepperoni Pizza");
  } else if (item.equals("clam")) {
   pizza=new ClamPizza(ingredientFactory);
   pizza.setName("New York Style Clame Pizza");
  } else if (item.equals("veggie")) {
   pizza=new VeggiePizza(ingredientFactory);
   pizza.setName("New York Style Veggie Pizza");
  } 
   return pizza;
 }
} 

abstract class Pizza {
 String name;
 Dough dough;
 Sauce sauce;
 Veggies veggies[];
 Cheese cheese;
 Pepperoni pepperoni;
 Clams clam;
 abstract void prepare(); 

 public void bake() {
  System.out.println("Bake for 25 minutes at 350");
 } 

 public void cut() {
  System.out.println("Cutting the pizza into diagonal slices");
 } 

 public void box() {
  System.out.println("Place pizza in official PizzaStore box");
 }
 
 public String getName() {
  return name;
 }
 void setName(String name){
  this.name=name;
 }
} 

class CheesePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public CheesePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class NYStyleCheesePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public NYStyleCheesePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class ChicagoStyleCheesePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public ChicagoStyleCheesePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class CaliforniaStyleCheesePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public CaliforniaStyleCheesePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class PepperoniPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public PepperoniPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class NYStylePepperoniPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public NYStylePepperoniPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class ChicagoStylePepperoniPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public ChicagoStylePepperoniPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class CaliforniaStylePepperoniPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public CaliforniaStylePepperoniPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
 }
} 

class ClamPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public ClamPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class NYStyleClamPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public NYStyleClamPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class ChicagoStyleClamPizz extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public ChicagoStyleClamPizz(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class CaliforniaStyleClamPizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public CaliforniaStyleClamPizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class VeggiePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public VeggiePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class NYStyleVeggiePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public NYStyleVeggiePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class ChicagoStyleVeggiePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public ChicagoStyleVeggiePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
} 

class CaliforniaStyleVeggiePizza extends Pizza {
 PizzaIngredientFactory ingredientFactory;
 public CaliforniaStyleVeggiePizza(PizzaIngredientFactory ingredientFactory) {
  this.ingredientFactory=ingredientFactory;
 }
 void prepare(){
  System.out.println("Preparing " + name);
  dough=this.ingredientFactory.createDough();
  sauce=this.ingredientFactory.createSauce();
  cheese=this.ingredientFactory.createCheese();
  clam=this.ingredientFactory.createClam();
 }
}
interface Dough{
 
}
class ThickCrustDough implements Dough{
 public ThickCrustDough(){
  System.out.println("ThickCrustDough");
 }
}
class ThinCrustDough implements Dough{
 public ThinCrustDough(){
  System.out.println("ThinCrustDough");
 }
}
interface Clams{
 
}
class FrozenClams implements Clams{
 public FrozenClams(){
  System.out.println("FrozenClams");
 }
}
class FreshClams implements Clams{
 public FreshClams(){
  System.out.println("FreshClams");
 }
}
interface Sauce{
 
}
class PlumTomatoSauce implements Sauce{
 public PlumTomatoSauce(){
  System.out.println("PlumTomatoSauce");
 }
}
class MarinaraSauce implements Sauce{
   public MarinaraSauce(){
    System.out.println("MarinaraSauce");
   }
}
 
interface Cheese{ 
}
class MozzarellaCheese implements Cheese{
 public MozzarellaCheese(){
  System.out.println("MozzarellaCheese");
 } 
}
class ReggianoCheese implements Cheese{
 public ReggianoCheese(){
  System.out.println("ReggianoCheese");
 }
}
interface  Pepperoni{
}
class SlicedPepperoni implements Pepperoni{
 public SlicedPepperoni(){
  System.out.println("SlicedPepperoni");
 }
}
interface Veggies{
}
class Garlic implements Veggies{
 public Garlic(){
  System.out.println("Garlic");
 }
}
class Onion implements Veggies{
 public Onion(){
  System.out.println("Onion");
 }
}
class Mushroom implements Veggies{
 public Mushroom(){
  System.out.println("Mushroom");
 }
}
class RedPepper implements Veggies{
 public RedPepper(){
  System.out.println("RedPepper");
 }
}
class BlackOlives implements Veggies{
 public BlackOlives(){
  System.out.println("BlackOlives");
 }
}
class Spinach implements Veggies{
 public Spinach(){
  System.out.println("Spinach");
 }
}
class Eggplant implements Veggies{
 public Eggplant(){
  System.out.println("Eggplant");
 }
}
interface PizzaIngredientFactory{
 public Dough createDough();
 public Sauce createSauce();
 public Cheese createCheese();
 public Veggies[] createVeggies();
 public Pepperoni createPepperoni();
 public Clams createClam();
}
class NYPizzaIngredientFctory implements PizzaIngredientFactory{
 public Dough createDough(){
  return new ThinCrustDough();
 }
 public Sauce createSauce(){
  return new MarinaraSauce();
 }
 public Cheese createCheese(){
  return new ReggianoCheese();
 }
 public Veggies[] createVeggies(){
  Veggies veggies[]={new Garlic(),new Onion(),new Mushroom(),new RedPepper()};
     return veggies;
 }
 public Pepperoni createPepperoni(){
  return new SlicedPepperoni();
 }
 public Clams createClam(){
  return new FreshClams();
 }
} 

class ChicagoPizzaIngredientFctory implements PizzaIngredientFactory{
 public Dough createDough(){
  return new ThinCrustDough();
 }
 public Sauce createSauce(){
  return new PlumTomatoSauce();
 }
 public Cheese createCheese(){
  return new MozzarellaCheese();
 }
 public Veggies[] createVeggies(){
  Veggies veggies[]={new BlackOlives(),new Spinach(),new Eggplant()};
     return veggies;
 }
 public Pepperoni createPepperoni(){
  return new SlicedPepperoni();
 }
 public Clams createClam(){
  return new FrozenClams();
 }
} 

  

package pattern; 

public class PizzaTestDrive {
 public static void main(String[] args) {
  PizzaStore nyStore = new NYPizzaStore();
  PizzaStore chicagoStore = new ChicagoPizzaStore();
  Pizza pizza = nyStore.orderPizza("cheese");
  System.out.println("Ethan ordered a " + pizza.getName() + "\n");
  pizza = chicagoStore.orderPizza("cheese");
  System.out.println("Joel ordered a " + pizza.getName() + "\n");
 }
}

  • 大小: 38.6 KB
分享到:
评论

相关推荐

    设计模式读书笔记

    创建型设计模式关注的是对象的创建,如工厂方法、抽象工厂、建造者、原型和单例模式,它们分别处理不同程度的对象创建延迟和实例化过程。结构型模式则涉及如何组合类和对象,包括适配器、桥接、组合、装饰器、外观、...

    JAVA模式的读书笔记

    3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这适用于需要创建多个产品族的情况,且每个产品族都有多个产品类型。 在实现这些模式时,需要考虑...

    设计模式笔记

    抽象工厂模式则是创建一系列相关或相互依赖的对象,它提供一个接口来创建一组相关的产品,而无需指定具体的实现。比如爷爷带孙子去KFC,抽象工厂负责创建一系列相关的产品(如汉堡、薯条等)。抽象工厂模式同样遵循...

    JAVA与模式读书笔记。

    在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...

    设计模式-读书笔记(水印)1

    本文主要探讨了两种创建型设计模式:工厂方法模式和抽象工厂模式。 首先,工厂方法模式的核心思想是将对象的创建过程延迟到子类中进行,允许子类决定实例化哪个类。它由四个主要角色组成:产品(Product)、具体...

    设计模式的读书总结笔记

    在阅读完设计模式的书籍后,通过笔记进行总结和比较,有助于巩固理解,例如比较工厂模式与抽象工厂模式的区别,或者分析不同模式在特定场景下的优劣。 总之,“设计模式的读书总结笔记”是一份宝贵的资源,它可以...

    Head First设计模式读书笔记-DesignPatterns.zip

    1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象工厂接口,避免了客户端与具体产品类之间的耦合。在实际应用中,例如,数据库连接的创建,我们可以使用工厂模式来创建...

    Java游戏编程读书笔记

    9. **游戏设计模式**:作为编程的最佳实践,设计模式在游戏开发中扮演重要角色,如单例模式用于管理全局资源,工厂模式用于对象创建,观察者模式用于事件处理等。 10. **性能优化**:Java的垃圾回收机制虽然方便,...

    JAVA面向对象编程(孙卫琴)读书笔记(三)

    - 设计模式是解决常见编程问题的经验总结,如工厂模式、单例模式、观察者模式等,它们是面向对象设计的精髓。 这篇读书笔记通过孙卫琴老师的视角,对上述知识点进行了详细解读和实例演示,有助于读者深入理解Java...

    GoF23种经典模式+简单工厂模式讲解还有一篇心得

    3. **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 4. **构造器模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 5. **原型模式**...

    Effective-Java读书笔记(上)

    **避免使用`Class.newInstance()`**:传统上,Java中的抽象工厂模式通常通过`Class`对象的`newInstance()`方法实现。这种方法的问题在于它会自动调用无参构造器,并且缺乏编译时检查,只能在运行时抛出异常。 **...

    设计模式之蝉

    “抽象工厂模式”(Abstract Factory pattern)也被简要提及,它是另一个创建型设计模式,用于创建一系列相关或相互依赖的对象。抽象工厂模式与工厂模式的不同之处在于,它不仅仅关注单一产品的创建,而是关注产品...

    thinking in java 读书笔记(五)

    这篇读书笔记主要聚焦在第五部分的内容,可能涵盖了类、对象、继承、多态等关键主题。由于没有具体的描述内容,我将根据《Thinking in Java》第五部分的一般性知识点进行阐述。 1. **类与对象**:在Java中,类是...

    golang-design-pattern:设计模式Golang实现-《研磨设计模式》读书笔记

    - 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。在Go中,可以使用接口和结构体组合实现。 - 建造者模式:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的...

    jsp数据库开发实例精粹

    业务逻辑层(BLL)包含了核心的业务代码,通过抽象封装成BLLIB和BBLStrategy,以适应不同业务策略,如同步和异步处理订单。 5. **设计模式的应用**: - **Factory模式**:在PetShop中,DALFactory使用Factory模式...

    软件工程书

    3. **设计模式应用**:介绍常用的设计模式,如单例模式、工厂模式、观察者模式等,并演示如何使用UML将其可视化。 4. **案例研究**:通过具体的软件项目案例,展示如何综合运用UML和设计模式进行软件设计和开发。 5....

    leetcode下载-Android_AutoTest:Android_AutoTest

    抽象工厂模式 状态模式 解释器模式 命令模式 备忘录模式 迭代器模式 模板方法模式 访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 第二部分 [JavaSE(Java基础)] [JVM(Java虚拟机)] 第三部分 ...

    Grady Booch--OOA&DwithApp 读后

    这篇读书笔记主要基于Booch对于OOA&D的见解和应用,结合实际的App开发情境,探讨了关键的设计原则、方法和工具。 首先,面向对象分析(OOA)是理解系统需求并将其转化为对象模型的过程。在Booch的方法中,核心是...

Global site tag (gtag.js) - Google Analytics