设计模式(9)----- 创建型模式-----工厂设计模式(抽象工厂模式)
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过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 - Abstract Factory抽象工厂模式
AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...
- 【Java设计模式 设计模式与范式】创建型模式 四:抽象工厂模式
本篇Blog继续学习创建型模式,创建型模式的主要关注点是怎样创建对象,它的主要特点是将对象的创建与使用分离,这样可以降低系统的耦合度,使用者不需要关注对象的创建细节.本篇学习的是抽象工厂模式.由于学习 ...
- 从零开始学习Java设计模式 | 创建型模式篇:抽象工厂模式
在本讲,我们来学习一下创建型模式里面的第三个设计模式,即抽象工厂模式. 前言 前面介绍的工厂方法模式中考虑的是一类产品,如畜牧场只养动物.电视机厂只生产电视机(不生产空调.冰箱等其它的电器).计算机学 ...
- 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)
创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...
- android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式
一.介绍,定义 抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现. 为创建一组相关或者相互依赖的对象提供接口,而不需要具体指定 ...
- GOF23设计模式(创建型模式)工厂模式
目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现
简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...
- 【地铁上的设计模式】--创建型模式:工厂方法模式
什么是创建模式 创建型模式是指处理对象创建的设计模式,它们的共同目标是通过某种方式控制对象的创建,以达到更灵活.更可扩展的设计. 创建型模式通常涉及到将对象的创建与使用分离,通过专门的工厂类.构造函数 ...
- 设计模式之创建型模式(工厂、原型、建造者)
文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...
最新文章
- 5.1 python的缩进
- python--html to pdf
- leetcode 621. Task Scheduler | 621. 任务调度器(Java)
- 自学Java汇报(3)
- 【转】DICOM开发工具总结
- 定点运算和浮点运算_C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧...
- View Flash AS3 and AVM2
- onclick传参数
- 使用ZooKeeper实现分布式队列、分布式锁和选举详解
- FCKEditor 打开页面总是得到焦点问题处理 FCKConfig.StartupFocus=false;
- python 代码片段24
- php 二维数组为空,php 判断数组是否为空的几种方法
- java的nullpoint_Java中避免NullPointerException的方法总结
- 重启计算机怎么一键还原系统还原,小编教你电脑怎么一键还原系统
- 【转】经济学名词解释大全汇总
- 十九、面向对象的定义,及基础语法
- JS中关于a+aa+aaa+aaaa的简便计算方法
- 学完计算机系统配置的心得,计算机课学习心得体会(精选3篇)
- 天空中的云怎么画?云雾、天空云彩的绘画技巧
- 机器学习领域的五大流派
热门文章
- 如何查看android虚拟机的目录及文件
- 9 线性表-队列-链式存储
- error: dst ref refs/heads/zhCN_v0.13.1 receives from more than one src.
- [转]Android--多线程之Handler
- Android 开发环境搭建之——ADT-Bundle for Windows
- 【SAS BASE】PROC SORT
- C# 随机数 Radom 循环生成同一的数字
- Asp.Net Repeater控件绑定泛型ListT的用法
- shell脚本批量删除几天前的文件
- 解决安卓手机input获取焦点时会将底部固定定位按钮顶起的问题