java面向对象基础设计模式,详解JAVA面向对象的设计模式 (三)、工厂模式

工厂模式 Factory

介绍

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

前言

工厂模式主要分为三种形式

简单工厂模式(不属于GoF的23种设计模式中)

工厂方法模式

抽象工厂模式

简单来说,本质上工厂模式是对创建对象过程的一种封装。通过封装,让客户端无需在意对象创建的过程和逻辑。看看下面的例子。

本文部分解释摘录自 id="简单工厂模式">简单工厂模式

比如我们去一家餐厅。我们想要点餐吃饭。

那么可以看作是客户得到了饮料,食物,餐具,然后一一使用。

不使用工厂模式时是这样的

public static void main(String[] args) {// 普通创建对象 Hamburger hamburger = new Hamburger(); Steak steak = new Steak(); hamburger.eat(); steak.eat();}

然而这样的创建对象,语义上不清晰且需要在客户端中初始化对象。

毕竟给我们制作食物的是餐厅,所以我们可以把餐厅理解成一种工厂。我们客户向餐厅点单就行了。

1586f89ac23b3b18b46d39eb5216bd5f.gif

在例子中实现

首先,餐厅生产的食品Food,都可以食用,创建接口eat。

public interface Food { void eat();}

那么使用汉堡和牛扒就应该如下实现

public class Hamburger implements Food { @Override public void eat() { System.out.println("吃汉堡,嘎嘎嘎"); }}public class Steak implements Food { @Override public void eat() { System.out.println("吃牛扒,嘎嘎嘎"); }}

那么餐厅,就可以作为生产这些产品的工厂

public class RestaurantFactory { public Food getFood(String type) { if (type == null) return null; else if (type.equalsIgnoreCase("hamburger")) return new Cock(); else if (type.equalsIgnoreCase("steak")) return new Hamburger(); return null; }}

有了餐厅工厂以后,客户下单就不需要自己去new食物了。直接问餐厅拿!

public static void main(String[] args) { // 普通创建对象 Hamburger hamburger = new Hamburger(); Steak steak = new Steak(); hamburger.eat(); steak.eat(); // 利用简单工厂创建对象 RestaurantFactory rpf = new RestaurantFactory(); Food hamburger = rpf.getFood("hamburger"); Food steak = rpf.getFood("steak"); hamburger.eat(); steak.eat();}

上面是普通创建,下面是简单工厂创建,最后会输出2次

吃汉堡,嘎嘎嘎

吃牛排,嘎嘎嘎

上面我们可以看到,我们把创建对象都写进了一个方法里。其实我们也可以分开写,一个方法获得一种对象也可以,看具体需求。

public class RestaurantFactory { public Food getHamburger() { return new Hamburger(); } public Food getSteak() { return new Steak(); }}

静态工厂

静态工厂只是在普通工厂上做一些小小的改变,意味着,工厂里的创建对象方法改写为静态方法,如此以来,就不需要new Factory 再操作工厂生成对象了。

public class RestaurantFactory { public static Food getHamburger() { return new Hamburger(); } public static Food getSteak() { return new Steak(); } }public static void main(String[] args) { // 利用静态工厂创建对象 Food hamburger = RestaurantFactory.getHamburger(); Food steak = RestaurantFactory.getSteak(); hamburger.eat(); steak.eat();}

简单工厂模式的缺点

每次需要创建新的对线的时候,就得去修改工厂类,这明显违背了面向对象设计中的“开闭原则”。

工厂方法模式

工厂方法在简单工厂上做了抽象处理。

把具体工厂抽象出了一个超级工厂,所有的具体工厂都实现这个抽象超级工厂。客户端通过访问具体工厂的工厂方法来创建产品。

结构

工厂方法模式的主要角色如下。

抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。

具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

450ae9ffeeec87bd901bde5fe74f9769.gif

在例子中实现

// 抽象工厂public abstract class FoodAbstractFactory { public abstract Food getFood();}// 具体工厂 麦当劳, Hamburger实现Food接口public class McDonaldFactory extend FoodAbstractFactoty { @Override public Food getFood() { return new Hamburger(); }}// 具体工厂 咖啡厅, Steak实现Food接口public c.........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值