假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

介绍

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。

我们先来看一张类图:

我们来看一下代码: PizzaStore 披萨工厂类

package com.DesignPatterns.ad.factory3;

public abstract class PizzaStore {

}

protected abstract Pizza createPizza(String item);

public Pizza orderPizza(String type) {

Pizza pizza = createPizza(type);

System.out.println("--- Making a " + pizza.getName() + " ---");     pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

NYPizzaStore纽约披萨工厂类

public class NYPizzaStore extends PizzaStore {

protected Pizza createPizza(String item) {

Pizza pizza = null;

PizzaIngredientFactory ingredientFactory =

new NYPizzaIngredientFactory();

if (item.equals("cheese")) {

pizza = new CheesePizza(ingredientFactory);

pizza.setName("纽约风格的奶酪披萨");

} else if (item.equals("veggie")) {

pizza = new VeggiePizza(ingredientFactory);

pizza.setName("纽约风格的素食披萨");

} else if (item.equals("clam")) {

pizza = new ClamPizza(ingredientFactory);

pizza.setName("纽约风格的蛤蜊披萨");

} else if (item.equals("pepperoni")) {

pizza = new PepperoniPizza(ingredientFactory);

pizza.setName("纽约风格的意大利香肠披萨");

}

return pizza;

}

}

ChicagoPizzaStore芝加哥披萨专卖店

public class ChicagoPizzaStore extends PizzaStore {

protected Pizza createPizza(String item) {

Pizza pizza = null;

PizzaIngredientFactory ingredientFactory =

new ChicagoPizzaIngredientFactory();

if (item.equals("cheese")) {

pizza = new CheesePizza(ingredientFactory);

pizza.setName("芝加哥奶酪披萨");

} else if (item.equals("veggie")) {

pizza = new VeggiePizza(ingredientFactory);

pizza.setName("芝加哥风格的素食披萨");

} else if (item.equals("clam")) {

pizza = new ClamPizza(ingredientFactory);               pizza.setName("芝加哥式蛤蜊披萨");

} else if (item.equals("pepperoni")) {

pizza = new PepperoniPizza(ingredientFactory);

pizza.setName("芝加哥风格的意大利香肠披萨");

}

return pizza;

}

}

PizzaIngredientFactory原料工厂接口类(抽象工厂模式)

public interface PizzaIngredientFactory {

public Dough createDough();// 创建面团

public Sauce createSauce();// 创建酱汁

public Cheese createCheese();// 创建奶酪

public Veggies[] createVeggies();// 创建蔬菜

public Pepperoni createPepperoni();// 创建意大利香肠     public Clams createClam();// 创建蛤

}

NYPizzaIngredientFactory纽约原料工厂实现类(抽象工厂模式)

public class NYPizzaIngredientFactory 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();

}

}

ChicagoPizzaIngredientFactory芝加哥原料工厂实现类(抽象工厂模式)

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {

public Dough createDough() {

return new ThickCrustDough();     }

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();

}

Pizza类

public abstract class Pizza {

String name;

Dough dough;

Sauce sauce;

Veggies veggies[];

Cheese cheese;

Pepperoni pepperoni;     Clams clam;

abstract void prepare();

void bake() {

System.out.println("在350度下烤25分钟");

}

void cut() {

System.out.println("把披萨切成对角线");

}

void box() {

System.out.println("将披萨放入正式的披萨店");

}

void setName(String name) {

this.name = name;

}

String

}

public

getName() {

return name;

String toString() {

StringBuffer result = new StringBuffer(); result.append("---- " + name + " ----\n"); if (dough != null) {

result.append(dough);

result.append("\n");

}

if (sauce != null) {

result.append(sauce);

result.append("\n");

}

if (cheese != null) {

result.append(cheese);

result.append("\n");

}

if (veggies != null) {

for (int i = 0; i < veggies.length; i++) {

result.append(veggies[i]);

if (i < veggies.length - 1) {

result.append(", ");

}

}

result.append("\n");

}

if (clam != null) {

result.append(clam);

result.append("\n");

}

if (pepperoni != null) {     result.append(pepperoni);

result.append("\n");

}

return result.toString();

}

}

纽约店来创建披萨Test

public static void main(String[] args) {

PizzaStore nyStore = new NYPizzaStore();

Pizza pizza = nyStore.orderPizza("cheese");

// 1,找到PizzaStore抽象类中来,因为这个时候nyStore是NYPizzaStore

// 2,调用了NYPizzaStore的createPizza方法

// 3,在NYPizzaStore的方法中有NYPizzaIngredientFactory实例,所以这个时候调用了

System.out.println("伊桑下令 " + pizza + "=======");

抽象的披萨店PizzaStore

public abstract class PizzaStore {

protected abstract Pizza createPizza(String item);

public Pizza orderPizza(String type) {

Pizza pizza = createPizza(type);

System.out.println("--- Making a " + pizza.getName() + " ---");

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

}

纽约的披萨店NYPizzaStore

public class NYPizzaStore extends PizzaStore {

protected Pizza createPizza(String item) {

Pizza pizza = null;

PizzaIngredientFactory ingredientFactory =

new NYPizzaIngredientFactory();

if (item.equals("cheese")) {

pizza = new CheesePizza(ingredientFactory);

pizza.setName("纽约风格的奶酪披萨");

} else if (item.equals("veggie")) {

pizza = new VeggiePizza(ingredientFactory);

pizza.setName("纽约风格的素食披萨");

} else if (item.equals("clam")) {

pizza = new ClamPizza(ingredientFactory);

pizza.setName("纽约风格的蛤蜊披萨");

} else if (item.equals("pepperoni")) {

pizza = new PepperoniPizza(ingredientFactory);

pizza.setName("纽约风格的意大利香肠披萨");

}

return pizza;

}

}

抽象纽约,芝加哥披萨原料类PizzaIngredientFactory

public interface PizzaIngredientFactory {

public Dough createDough();// 创建面团

public Sauce createSauce();// 创建酱汁

public Cheese createCheese();// 创建奶酪

public Veggies[] createVeggies();// 创建蔬菜

public Pepperoni createPepperoni();// 创建意大利香肠

public Clams createClam();// 创建蛤

}

具体的纽约原料披萨类NYPizzaIngredientFactory

public class NYPizzaIngredientFactory 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();

}

}

纽约,芝加哥面团接口类Dough

public interface Dough {     public String toString();

}

纽约面团实现类ThinCrustDough

public class ThinCrustDough implements Dough {

public String toString() {

return "薄的地壳面团";

}

}

纽约,芝加哥蕃茄接口类Sauce

public interface Sauce {     public String toString();

}

纽约番茄接口实现类MarinaraSauce

public class MarinaraSauce implements Sauce {

public String toString() {

return "加番茄酱";

}

}

纽约,芝加哥奶酪接口类Cheese

public interface Cheese {     public String toString();

}

纽约奶酪接口实现类MozzarellaCheese

public class ReggianoCheese implements Cheese {

public String toString() {

return "雷奇亚干酪奶酪";

}

}

芝加哥来创建披萨test实现类

public static void main(String[] args) {

PizzaStore chicagoStore = new ChicagoPizzaStore();

// 1,找到PizzaStore抽象类中来,因为这个时候nyStore是NYPizzaStore

// 2,调用了NYPizzaStore的createPizza方法

// 3,在NYPizzaStore的方法中有NYPizzaIngredientFactory实例,所以这个时候调用了

Pizza pizza = chicagoStore.orderPizza("cheese");

System.out.println("乔尔下令 " + pizza + "=======");

抽象的披萨店PizzaStore

public abstract class PizzaStore {

protected abstract Pizza createPizza(String item);

public Pizza orderPizza(String type) {

Pizza pizza = createPizza(type);

System.out.println("--- Making a " + pizza.getName() + " ---");

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

}

ChicagoPizzaStore芝加哥原料工厂类

public class ChicagoPizzaStore extends PizzaStore {

protected Pizza createPizza(String item) {

Pizza pizza = null;

PizzaIngredientFactory ingredientFactory =

new ChicagoPizzaIngredientFactory();

if (item.equals("cheese")) {

pizza = new CheesePizza(ingredientFactory);

pizza.setName("芝加哥奶酪披萨");

} else if (item.equals("veggie")) {

pizza = new VeggiePizza(ingredientFactory);

pizza.setName("芝加哥风格的素食披萨");

} else if (item.equals("clam")) {

pizza = new ClamPizza(ingredientFactory);               pizza.setName("芝加哥式蛤蜊披萨");

} else if (item.equals("pepperoni")) {

pizza = new PepperoniPizza(ingredientFactory);

pizza.setName("芝加哥风格的意大利香肠披萨");

}

return pizza;

}

}

抽象纽约,芝加哥披萨原料类PizzaIngredientFactory

public interface PizzaIngredientFactory {

public Dough createDough();// 创建面团

public Sauce createSauce();// 创建酱汁

public Cheese createCheese();// 创建奶酪

public Veggies[] createVeggies();// 创建蔬菜

public Pepperoni createPepperoni();// 创建意大利香肠

}

public Clams createClam();// 创建蛤

芝加哥原料工厂类ChicagoPizzaIngredientFactory

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {

public Dough createDough() {

return new ThickCrustDough();     }

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();

}

}

纽约,芝加哥面团接口类Dough

public interface Dough {     public String toString();

}

纽约面团实现类ThickCrustDough

public class ThickCrustDough implements Dough {

public String toString() {

return "厚皮面团";

}

}

纽约,芝加哥蕃茄接口类Sauce

public interface Sauce {     public String toString();

}

纽约番茄接口实现类MarinaraSauce

public class PlumTomatoSauce implements Sauce {

public String toString() {

return "蕃茄酱配梅子蕃茄";

}

}

纽约,芝加哥奶酪接口类Cheese

public interface Cheese {     public String toString();

}

纽约奶酪接口实现类MozzarellaCheese

public class MozzarellaCheese implements Cheese {

public String toString() {

return "马苏里拉奶酪丝";

}

}

抽象工厂模式的定义

可不可以这样理解抽象工厂是比工厂更抽象的工厂,以前的工厂方法中海油具体的实现,而现在抽象工厂中全部都是抽象的方法。

其实还可以这样理解,工厂定义是让子类来决定自己到底是谁,可能是披萨1,披萨2,披萨3等等。接下来开始做披萨该做的事情。而抽象的则是不需要返回具体了类,比如说现在返回披萨的总和,又返回面包的总和,当我用的时候可能是披萨1+面包1,披萨1+面包2,披萨2+面包1,等等,更倾向于组合。关注点不一样,工厂关注与返回当前的产品的实例,而抽象则关注与返回一组数据的组合。

当产品只有一个的时候抽象工厂变成工厂,当产品有多个的时候工厂变成抽象工厂。

在增加一个案例,更清晰一点的

产品接口类

package com.DesignPatterns.ad.factory5;public abstract class Vehicle {public abstract void run();
}

package com.DesignPatterns.ad.factory5;public abstract class Weapon {public abstract void shoot();
}

package com.DesignPatterns.ad.factory5;public abstract class Food {public abstract void printName();
}

工厂接口类

package com.DesignPatterns.ad.factory5;public abstract class AbstractFactory {public abstract Vehicle createVehicle();public abstract Weapon createWeapon();public abstract Food createFood();}

工厂实现类

package com.DesignPatterns.ad.factory5;public class DefaultFactory extends AbstractFactory{@Overridepublic Food createFood() {return new Apple();}@Overridepublic Vehicle createVehicle() {return new Car();}@Overridepublic Weapon createWeapon() {return new AK47();}}

产品实现类

package com.DesignPatterns.ad.factory5;public class Apple extends Food {public void printName() {System.out.println("apple");}
}

package com.DesignPatterns.ad.factory5;public class Car extends Vehicle {public void run() {System.out.println("冒着烟奔跑中car.......");}
}

package com.DesignPatterns.ad.factory5;public class AK47 extends Weapon{public void shoot() {System.out.println("哒哒哒...");}
}

工厂实现类

package com.DesignPatterns.ad.factory5;public class MagicFactory extends AbstractFactory {@Overridepublic Food createFood() {return new MushRoom();}@Overridepublic Vehicle createVehicle() {return new Broom();}@Overridepublic Weapon createWeapon() {return new MagicStick();}}

package com.DesignPatterns.ad.factory5;public class MushRoom extends Food {@Overridepublic void printName() {// TODO Auto-generated method stubSystem.out.println("mushroom");}}

package com.DesignPatterns.ad.factory5;public class Broom  extends Vehicle{public void run() {System.out.println("一路沙尘暴飞奔而来broom.....");}}

package com.DesignPatterns.ad.factory5;public class MagicStick extends Weapon {@Overridepublic void shoot() {System.out.println("fire hu hu hu ...");}}

package com.DesignPatterns.ad.factory5;
/*** * @author qingruihappy* @data   2018年11月5日 上午12:50:24* @说明:假如说工厂模式是一个产品对应着一个产品工厂的话,那么抽象工厂模式就是一组产品对应着一个产品工厂。* 抽象工厂模式也有缺点,就是假如要产生新的产品品种的时候改动的地方也比较大。* 比如该例子中的工厂中要加一个带着头盔的方法,那么以前的只要实现了AbstractFactory的工厂都要进行变更,严重违反了* 设计模式的对修改关闭,对新增开放的原则。* 有什么好的方法吗?* 我们来看一下spring提供的创建bean的原理及实现。*/
public class Test {public static void main(String[] args) {//DefaultFactory f = new DefaultFactory();AbstractFactory f = new DefaultFactory();Vehicle v = f.createVehicle();v.run();Weapon w = f.createWeapon();w.shoot();Food a = f.createFood();a.printName();}
}

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

kk

设计模式(9)----- 创建型模式-----工厂设计模式(抽象工厂模式)相关推荐

  1. 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式

    AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...

  2. 【Java设计模式 设计模式与范式】创建型模式 四:抽象工厂模式

    本篇Blog继续学习创建型模式,创建型模式的主要关注点是怎样创建对象,它的主要特点是将对象的创建与使用分离,这样可以降低系统的耦合度,使用者不需要关注对象的创建细节.本篇学习的是抽象工厂模式.由于学习 ...

  3. 从零开始学习Java设计模式 | 创建型模式篇:抽象工厂模式

    在本讲,我们来学习一下创建型模式里面的第三个设计模式,即抽象工厂模式. 前言 前面介绍的工厂方法模式中考虑的是一类产品,如畜牧场只养动物.电视机厂只生产电视机(不生产空调.冰箱等其它的电器).计算机学 ...

  4. 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)

    创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...

  5. android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式

    一.介绍,定义 抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现. 为创建一组相关或者相互依赖的对象提供接口,而不需要具体指定 ...

  6. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  7. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  8. (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...

  9. 【地铁上的设计模式】--创建型模式:工厂方法模式

    什么是创建模式 创建型模式是指处理对象创建的设计模式,它们的共同目标是通过某种方式控制对象的创建,以达到更灵活.更可扩展的设计. 创建型模式通常涉及到将对象的创建与使用分离,通过专门的工厂类.构造函数 ...

  10. 设计模式之创建型模式(工厂、原型、建造者)

    文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...

最新文章

  1. 5.1 python的缩进
  2. python--html to pdf
  3. leetcode 621. Task Scheduler | 621. 任务调度器(Java)
  4. 自学Java汇报(3)
  5. 【转】DICOM开发工具总结
  6. 定点运算和浮点运算_C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧...
  7. View Flash AS3 and AVM2
  8. onclick传参数
  9. 使用ZooKeeper实现分布式队列、分布式锁和选举详解
  10. FCKEditor 打开页面总是得到焦点问题处理 FCKConfig.StartupFocus=false;
  11. python 代码片段24
  12. php 二维数组为空,php 判断数组是否为空的几种方法
  13. java的nullpoint_Java中避免NullPointerException的方法总结
  14. 重启计算机怎么一键还原系统还原,小编教你电脑怎么一键还原系统
  15. 【转】经济学名词解释大全汇总
  16. 十九、面向对象的定义,及基础语法
  17. JS中关于a+aa+aaa+aaaa的简便计算方法
  18. 学完计算机系统配置的心得,计算机课学习心得体会(精选3篇)
  19. 天空中的云怎么画?云雾、天空云彩的绘画技巧
  20. 机器学习领域的五大流派

热门文章

  1. 如何查看android虚拟机的目录及文件
  2. 9 线性表-队列-链式存储
  3. error: dst ref refs/heads/zhCN_v0.13.1 receives from more than one src.
  4. [转]Android--多线程之Handler
  5. Android 开发环境搭建之——ADT-Bundle for Windows
  6. 【SAS BASE】PROC SORT
  7. C# 随机数 Radom 循环生成同一的数字
  8. Asp.Net Repeater控件绑定泛型ListT的用法
  9. shell脚本批量删除几天前的文件
  10. 解决安卓手机input获取焦点时会将底部固定定位按钮顶起的问题