`

工厂模式:抽象工厂

 
阅读更多

接着上一篇说过的工厂方法,这节来谈一谈抽象工厂:

首先来看一个设计原则

依赖倒置原则:要依赖抽象,不要依赖具体类。不能让高层组件依赖低层组件,而且,不管高层或低层组件,“两者”都应该依赖于抽象。

 

再回到比萨店:

使用工厂方法后,各地的比萨加盟店生意火爆,但也有些加盟店使用劣质原料,导致信誉下降。

现在我们要创建一个工厂来生产原料,这个工厂负责创建原料家族中的每一种原料。

先来为原料工厂定义一个接口

public interface PizzaIngredientFactory{
  public Dough createDough();
  public Sauce createSauce();
  public Cheese createCheese();
  public veggies[] createVeggiees();
  public Pepperoni createPepperoni();
  public Clams createClam();
}

 接下来要做的是为每一个区域建立一个原料工厂

1,实现PizzaIngredientFactory接口。

2,实现一组原料供工厂使用,例如RedPeppers、ThickCrustDough,每个区域的原料都略有差异。

3,将这一切组织起来,将新的原料工厂整合进旧的PizzaStore中。

 

让我们来看看纽约原料工厂是怎么实现的

public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
  public Dough createDough(){
    return new ThinCrustDough();
  }
  public Sauce createSauce(){
    return new MarinaraSauce();
  }
  public Veggies[] createVeggies(){
     Veggies veggies[] = {new Garlic(),new Onion(),new Mushroom()};
     return veggies;
  }
  public Pepproni createPepperoni(){
     return new SlicedPepperoni();
  }
  pubilc Clams createClam(){
     return new FreshClams();
  }
}

 

定义Pizza基类,由子类实现prepare方法

package com.headfirst.chapter4;

import java.util.ArrayList;
import java.util.List;

public abstract class Pizza {
	String name;
	String dough;
	String sauce;
	Veggies veggies[];
	Cheese cheese;
	Pepperoni pepperoni;
	Clam clam;
	abstract void prepare();
	
	void bake(){
		System.out.println("Bake for 25 minutes at 350 ");
	}
	void cut(){
		System.out.println("Cutting the pizza into diagonal slices ");
	}
	void box(){
		System.out.println("Place pizza in offical PizzaStore box");
		System.out.println();
	}
	public String getName(){
		return name;
	}
}

 

我们来实现一个CheesePizza类,它继承Pizza基类

NYCheesePizza和ChicagoCheesePizzao类相似,唯一的不同是使用区域性的原料。比萨的做法都一样。

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

 

也来看看ClamPizza(蛤蜊比萨)

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

 

再回到比萨店,在纽约比萨店里使用纽约原料工厂。

pubic class NYPizzaStore extends PizzaStore{
  public Pizza createPizza(String item){
     PizzaIngredientFactory factory = new NYPizzaIngredientFactory();
     Pizza pizza = null;
     if(item.equals("cheese")){
       pizza = new CheesePizza(factory);
     }else if(item.equals("clam")){
        pizza = new ClamPizza(factory);
     }
     return pizza;
  }
}

  

 抽象工厂的定义:

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

 

 

工厂方法与抽象工厂的区别:

两个工厂都是负责创建对象,工厂方法是使用继承抽象方法,这意味着利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。

抽象工厂负责创建一个产吕家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂必须先实例化它。然后将它传入

一些针对抽象类型所写的代码中。

它们两个的区别是:抽象工厂需要一个大的接口,因为它是用来创建整个产品家族的(比如,从多原料,每个原料都是一个对象,那么一次就要生产多个对象),

而工厂方法只是创建一个产品,所以根本不需要一个大的接口,只需要一个方法就可以了。

抽象工厂的具体工厂一般使用工厂方法来创建它们的产品,

分享到:
评论

相关推荐

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    简单工厂模式、工厂模式、抽象工厂模式案例(C++实现)

    在这个压缩包中,包含了三种工厂模式的C++实现:简单工厂模式、工厂方法模式以及抽象工厂模式。让我们一一探讨这些模式。 1. 简单工厂模式: 简单工厂模式是一种静态工厂方法,它提供一个公共的工厂类来创建对象。...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    肯德基:抽象工厂模式

    通过抽象工厂模式的静态建模,我们可以看到客户通过抽象工厂接口请求产品,而具体的工厂负责生产具体的产品。 在实现抽象工厂模式时,我们首先需要定义抽象食物以及食物接口。然后,我们需要创建不同食物的抽象基类...

    Java工厂模式:简单工厂、工厂方法模式、抽象工厂模式代码示例

    在抽象工厂模式中,每个抽象产品都对应一个抽象工厂,而每个具体工厂都能创建属于同一产品族的所有产品。这有助于将产品族的创建逻辑封装在一起,但新增产品族时需要修改抽象工厂接口,违反了开闭原则。

    深入理解Python设计模式:抽象工厂模式实践与应用

    深入理解Python设计模式:抽象工厂模式实践与应用

    探索Java设计模式:工厂模式与抽象工厂模式的比较

    工厂模式和抽象工厂模式是两种常用的创建型设计模式,它们在Java中有着广泛的应用。本文将详细探讨这两种模式的区别,并提供代码示例来加深理解。 工厂模式和抽象工厂模式都是创建型设计模式,它们提供了代码解耦和...

    工厂方法模式和抽象工厂模式的区别

    工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...

    Android之大话设计模式:抽象工厂模式终稿.pdf

    **抽象工厂模式**是软件设计模式中的一种创建型模式,主要用在需要创建一系列相关或相互依赖的对象,而无需指定它们具体的类时。这个模式的关键在于提供了一个接口,允许客户端在不关心产品具体实现的情况下创建多个...

    (超详细,超易懂)设计模式(三):抽象工厂模式,灵山派系谁上位

    抽象工厂模式由以下几个角色组成: 抽象工厂(AbstractFactory):定义了一组创建产品的抽象方法。 具体工厂(ConcreteFactory):实现了抽象工厂定义的抽象方法,用于创建具体产品的实例。 抽象产品...

    抽象工厂模式+工厂方法模式+策略模式+类图实现手机加工厂

    在手机加工厂的案例中,类图可以描绘出抽象工厂、具体工厂、手机产品类以及各种策略类之间的关系,帮助开发者更好地理解和设计系统。 综上所述,抽象工厂模式用于创建品牌相关的手机生产线,工厂方法模式细化到具体...

    C#设计模式:抽象工厂实例解析.7z

    "抽象工厂"模式是一种创建型设计模式,它提供了一个接口来创建一系列相关或相互依赖的对象,而无需指定它们的具体类。在C#中,我们可以利用抽象工厂模式来实现跨平台、跨环境的对象创建。 抽象工厂模式的核心思想...

    简单工厂-工厂方法-抽象工厂 对比总结

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    工厂方法模式和抽象工厂模式

    在软件设计模式中,工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)是两种常用的创建型设计模式,它们都属于“工厂”家族,但有着不同的应用场景和目标。 工厂方法模式的核心...

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

    C#编程模式之工厂方法模式+抽象工厂模式

    抽象工厂模式通常由抽象工厂、具体工厂、抽象产品和具体产品组成。通过切换具体工厂实现类,可以改变整个族群。 工厂方法模式:它将对象的创建延迟到子类中进行。由子类决定具体实例化哪个类。通过切换具体工厂的...

    第三讲:抽象工厂模式

    - **封装性**:抽象工厂模式封装了产品创建的细节,客户端只需要与抽象工厂交互,无需关心具体实现。 - **灵活性**:当需要添加新的产品族或修改现有产品族时,只需添加或修改具体工厂,不会影响到其他部分的代码。 ...

    抽象工厂模式uml类图

    java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

Global site tag (gtag.js) - Google Analytics