简单工厂模式

案例:

披萨的项目(要便于披萨种类的扩展,要便于维护)

1)披萨的种类很多(比如 GreekPizz、CheesePizz 等)
2)披萨的制作有 prepare,bake, cut, box
3)完成披萨店订购功能。

使用传统的方式来完成

编写 OrderPizza.java 去订购需要的各种 Pizza

Pizza类

package com.lin.simplefactory;

public class SimpleFactoryDemo {

}

abstract class Pizza{

    private String name;

    public void setName(String name) {
this.name = name;
} public void prepare() {
System.out.println(name + " are prepared!");
} public void bake() {
System.out.println(name + " are baked!");
} public void cut() {
System.out.println(name + " are cutted!");
} public void box() {
System.out.println(name + " are boxed!");
} } // chesspizza
class ChessPizza extends Pizza{ } // greekpizza
class GreekPizza extends Pizza{ } // chinapizza
class ChinaPizza extends Pizza{ }

OrderPizza类

package com.lin.simplefactory;

import java.util.Scanner;
/**
* 假如有很多orderpizza,如果增加一种pizza种类,修改就很麻烦,效率低
* @Description:
* @author LinZM
* @date 2021-2-3 0:29:26
* @version V1.8
*/
public class OrderPizza { public OrderPizza(){
Pizza pizza = null;
String orderType;
while(true) {
orderType = getType();
if(orderType.equals("chess")) {
pizza = new ChessPizza();
pizza.setName("chesspizza");
} else if(orderType.equals("greek")) {
pizza = new ChessPizza();
pizza.setName("greekpizza");
} else if(orderType.equals("china")) {
pizza = new ChessPizza();
pizza.setName("chinapizza");
} else {
break;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}public String getType() { Scanner str = new Scanner(System.in);
System.out.println("please input the type of ordered pizza:");
String type = str.next();
return type;
}
}

PizzaStore类

package com.lin.simplefactory;

public class PizzaStore {

    public static void main(String[] args) {
new OrderPizza();
}
}

传统的方式的优缺点

1)优点是比较好理解,简单易操作。
2)缺点是违反了设计模式的 ocp 原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
3)比如我们这时要新增加一个 Pizza 的种类(Pepper 披萨),我们需要做如下修改. 如果我们增加一个 Pizza 类,只要是订购 Pizza 的代码都需要修改.

改进的思路分析

分析:修改代码可以接受,但是如果我们在其它的地方也有创建 Pizza 的代码,就意味着,也需要修改,而创建 Pizza

的代码,往往有多处。

思路:把创建 Pizza 对象封装到一个类中,这样我们有新的 Pizza 种类时,只需要修改该类就可,其它有创建到 Pizza

对象的代码就不需要修改了.-> 简单工厂模式

基本介绍

1) 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。

2) 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。

3) 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

使用简单工厂模式

简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类,封装创建对象的代码。

Pizza类不变

OrderPizza类

package com.lin.simplefactory;

import java.util.Scanner;
/**
* 假如有很多orderpizza,如果增加一种pizza种类,修改就很麻烦,效率低
* @Description:
* @author LinZM
* @date 2021-2-3 0:29:26
* @version V1.8
*/
public class OrderPizza { //定义一个工厂对象
public SimpleFactory factory = null;
public Pizza pizza = null; // 构造器
public OrderPizza(SimpleFactory factory) {
setFactory(factory);
}
public void setFactory(SimpleFactory factory) {
String type = "";
this.factory = factory;
while(true) {
type = getType();
pizza = this.factory.createPizza(type); if(pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("没有这种披萨!");
break;
}
}
} public String getType() { Scanner str = new Scanner(System.in);
System.out.println("please input the type of ordered pizza:");
String type = str.next();
return type;
}
}

增加一个类--SimpleFatcory类

package com.lin.simplefactory;
/**
* 简单工厂模式
* @Description:
* @author LinZM
* @date 2021-2-3 0:28:04
* @version V1.8
*/
public class SimpleFactory { public Pizza createPizza(String orderType) {
Pizza pizza = null; System.out.println("使用简单工厂模式");
if(orderType.equals("chess")) {
pizza = new ChessPizza();
pizza.setName("chesspizza");
} else if(orderType.equals("greek")) {
pizza = new ChessPizza();
pizza.setName("greekpizza");
} else if(orderType.equals("china")) {
pizza = new ChessPizza();
pizza.setName("chinapizza");
}
return pizza;
}
}

PizzaStore类

package com.lin.simplefactory;

public class PizzaStore {

    public static void main(String[] args) {
// new OrderPizza();
new OrderPizza(new SimpleFactory());
}
}

同时,简单工厂模式又叫静态工厂模式,在OrderPizza类中将creatPizza改为static,在后面使用类.方法名方式调用该方法。

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

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

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

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...

  2. Java描述设计模式(02):简单工厂模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...

  3. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  4. Unity C# 设计模式(二)简单工厂模式

    定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...

  5. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

  6. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

  7. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...

  8. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  9. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

随机推荐

  1. linux系统修改不成功无法修改密码

    一.问题描述 新上架的浪潮服务器使用装机平台进行统一安装,安装完成后修改用户密码时统一无法修改,使用root账户无法修改其他用户密码,自身根密码也无法修改成功,报错如下 Changing passwo ...

  2. MySQL/MariaDB二进制安装

    本文说明MySQL/MariaDB二进制安装的过程 mysql和mariadb的安装方式基本一致,唯一初始化方式有点不一样 1.规划: 数据文件存储位置                /data/my ...

  3. Go 的定时任务模块 Cron 使用

    前言 新项目是Golang作为开发语言, 遇到了些新的坑, 也学到了新的知识, 收获颇丰 本章介绍在Go中使用Cron定时任务模块来实现逻辑 正文 在项目中, 我们往往需要定时执行一些逻辑, 举个例子 ...

  4. Docker学习笔记之搭建Docker私有仓库

    Docker仓库服务器名为Docker注册(registry)服务器.可以使用docker push命令将镜像上传到注册服务器,也可以使用docker pull命令下载服务器的镜像. Docker注册 ...

  5. 【Problems】MySQL5.7 datetime 默认值设为‘0000-00-00 00:00:00'值出错

    记录 MySQL5.7 datetime 默认值设为'0000-00-00 00:00:00'值出错 我的MySQL版本 mysql --version 5.7.28 C:\Users\x1c> ...

  6. alter column和modify column

    5.6中,发现其实alter column 和更改modify column 步骤是一样的 mysql> create table xs(name varchar(12),age int def ...

  7. Java并发/多线程-CAS原理分析

    目录 什么是CAS 并发安全问题 举一个典型的例子i++ 如何解决? 底层原理 CAS需要注意的问题 使用限制 ABA 问题 概念 解决方案 高竞争下的开销问题 什么是CAS CAS 即 compar ...

  8. cmd的终结工具cmder

    常用快捷键 win+alt+t  打开任务设置窗口 win+alt+k 打开快捷键设置窗口 自定义屏幕分割窗口快捷键: ctl+shift+s 水平按50%比例分割 ctl+shift+v 垂直按50 ...

  9. oracle RAC和RACOneNode之间的转换

    Convert RAC TO RACOneNode 1.查看资源状态 [grid@rac01 ~]$ crsctl status res -t 从这里看到,数据库的名字叫racdb 2.查看实例 [o ...

  10. Dubbo中的统一契约是如何实现的?

    写在前面 之前,很多小伙伴私信我:如何才能快速的掌握Dubbo的核心原理和源码.所以,我写了一篇<我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?>.对于Dubbo的源码解析系 ...