定义:定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常有公共的父类。

模式类型:创建型模型

Factory(工厂角色):即工厂类,负责实现创建所有产品实例的内部逻辑;工厂类可以直接被外界调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法FactoryMethod(),它的返回类型为抽象产品Product。

Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公共方法。提高了系统的灵活性,使得工厂类只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。

ConcreteProduct(具体产品角色):所有被创建的对象都充当某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

案例:pizza生产简单工厂模式

 /**
* @author EASON
* @date 2017.1.7 13:23
* @function 工厂模式
*/
package com.nju; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Test {
public static void main(String[] args) {
PizzaStore ps = new PizzaStore();
ps.orderPizza();
}
} //抽象产品类
interface Pizza{
public void prepare();
public void bake();
public void cut();
public void packaged();
} //具体产品类-奶酪披萨
class CheesePizza implements Pizza{
//具体产品类需要实现抽象产品类中的方法
public void prepare() {
System.out.println("奶酪披萨开始制作...");
} public void bake() {
System.out.println("奶酪披萨开始烘焙...");
} public void cut() {
System.out.println("奶酪披萨开始切块...");
} public void packaged() {
System.out.println("奶酪披萨包装完毕...");
} } //具体产品类-洋葱披萨
class PepperoniPizza implements Pizza{ public void prepare() {
System.out.println("洋葱披萨开始制作...");
} public void bake() {
System.out.println("洋葱披萨开始烘焙...");
} public void cut() {
System.out.println("洋葱披萨开始切块...");
} public void packaged() {
System.out.println("洋葱披萨包装完毕...");
} } //Pizza工厂类
class PizzaFactory{
public Pizza getPizza(String pizzaType){
switch(pizzaType){
case("cheesePizza"):
return new CheesePizza();
case("pepperonPizza"):
return new PepperoniPizza();
default:
return null;
}
}
} //Pizza商店类
class PizzaStore{
public void orderPizza(){
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PizzaFactory pf = new PizzaFactory();
System.out.println("欢迎光临!");
System.out.println("请输入你想要购买的Pizza:");
try {
String pizzaType = bf.readLine();
Pizza pizza = pf.getPizza(pizzaType);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.packaged();
System.out.println("欢迎下次光临!");
} catch (IOException e) {
e.printStackTrace();
}
}
}

使用简单工厂模式的好处,可以把复杂的逻辑判断代码从PizzaStore中分离出来,即便需要修改判断逻辑,也不会影响PizzaStore,符合OCP。

设计模式 — 简单工厂模式(Simple Factory)的更多相关文章

  1. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  2. 设计模式之简单工厂模式Simple Factory(四创建型)

    工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...

  3. 【设计模式】简单工厂模式 Simple Factory Pattern

    简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...

  4. 创建型模式(前引)简单工厂模式Simple Factory

    一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...

  5. 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  6. 设计模式--简单工厂(Simple Factory)

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  7. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  8. 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

    什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...

  9. C#设计模式-1简单工厂模式Simple Factory)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 简单的工 ...

  10. 设计模式之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式的由来 所有设计模式都是为解决某类问题而产生的,那么简单工厂模式是为解决什么问题呢?我们假设有以下业务场景: 在一个学生选课系统中,文科生用户选课时,我们要获得文科生的所有课程列表:理 ...

随机推荐

  1. 异步 HttpContext.Current 为空null 另一种解决方法

    1.场景 在导入通讯录过程中,把导入的失败.成功的号码数进行统计,然后保存到session中,客户端通过轮询显示状态. 在实现过程中,使用的async调用方法,出现HttpContext.Curren ...

  2. WPF 普通属性变化通知

    问题描述:使用ObservableCollection<OrderItem> source 给Datagrid.ItemsSource赋值,在后台更新source集合后,前台Datagri ...

  3. C# 用SoapUI调试WCF服务接口(WCF中包含用户名密码的验证)

    问题描述: 一般调试wcf程序可以直接建一个单元测试,直接调接口. 但是,这次,我还要测试在接口内的代码中看接收到的用户名密码是否正确,所以,单一的直接调用接口方法行不通, 然后就想办法通过soapU ...

  4. 【转】java通用URL接口地址调用方式GET和POST方式

    java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...

  5. Docker与CI持续集成/CD

    背景        Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...

  6. 【干货分享】流程DEMO-外出申请

    流程名: 外出申请  流程相关文件: 流程包.xml  流程说明: 直接导入流程包文件,即可使用本流程  表单:   流程: 图片:2.png DEMO包下载: http://files.cnblog ...

  7. ExtJS 项目准备工作(一)

    首先,需要从网上下载两个文件,一个是SenchaCmd-6.2.0-windows-64bit(我的电脑是window 10 64位) 另一个是ExtJs6的源码包(ext-6.0.0.415). 源 ...

  8. [故障公告]受阿里云部分ECS服务器故障影响,目前无法上传图片与文件

    抱歉!今天下午阿里云华东1可用区B的部分ECS服务器出现IO HANG问题,受此影响,我们的图片与文件上传服务器无法访问,由此给您带来麻烦,请您谅解. 16:30左右开始,我们发现图片与文件上传服务器 ...

  9. MapReduce剖析笔记之四:TaskTracker通过心跳机制获取任务的流程

    上一节分析到了JobTracker把作业从队列里取出来并进行了初始化,所谓的初始化,主要是获取了Map.Reduce任务的数量,并统计了哪些DataNode所在的服务器可以处理哪些Split等等,将这 ...

  10. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...