淡水鱼养殖场就是一个简单工厂java_Java设计模式之工厂方法模式

1.简单工厂模式

在谈到java的工厂方法模式之前,首先来谈一谈简单工厂模式。那么什么是简单工厂模式呢?我们都知道,在现实生活当中,工厂是负责生产商品的,自然在java的设计模式之中,工厂也是负责生产商品的,不过与之不同的是,此时的商品指的是java类。在编程中,当使用new关键字创建一个类的对象时,此时该类依赖于该对象,自然他们之间的耦合度比较高,当需求变化时,我们不得不去修改此时的类的源码,很显然在某些情况下这需要非常大的工作量,此时我们就需要在起初类的设计时,对其进行封装,把那些需要改变的类封装起来,这一种思路就是简单工厂的实现方式。

从设计模式的类型上来说,简单工厂模式属于创建型模式,但并不属于java常见的23中设计模式的一种,之所以讲它,是因为它是工厂模式家族中最简单实用的一种模式,是工厂方法模式和抽象工厂模式的基础和初步实现。下面是简单工厂模式的uml类图。

41364e828a12b0e00ff24d7ccd3c42ef.png

简单工厂:SimpleProductFactory

简单工厂是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,具体构造细节实在一个个if/else分支,或是在switch/case分支中实现的。

抽象产品:Product

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所有的公共接口

具体产品:objectclass

实现抽象产品,可以说是一些具体的产品

接下来通过实际的代码来解释这种设计模式:

假设一个淡水鱼养殖场可以生产很多的淡水鱼,比如草鱼,鲤鱼等,只要告诉老板淡水鱼的类型,就会给你生产出对应的鱼来,自然我们可以从中看出,这个养殖场就是一个简单的工厂,而这些鱼则是一个个具体的产品,具体代码如下:

//抽象产品类

interface FreshWaterFish{

void grow(); //鱼在长大

void harvset(); //鱼可以被收获了

}

//具体产品类

class Grasscarp implements FreshWaterFish{

@Override

public void grow() {

System.out.println("草鱼正在生长!");

}

@Override

public void harvset() {

System.out.println("草鱼可以被收获了!");

}

}

//具体产品类

class Crap implements FreshWaterFish{

@Override

public void grow() {

System.out.println("鲤鱼正在生长!");

}

@Override

public void harvset() {

System.out.println("鲤鱼可以收获了!");

}

}

//具体产品类

class Catfish implements FreshWaterFish{

@Override

public void grow() {

System.out.println("鲇鱼正在生长!");

}

@Override

public void harvset() {

System.out.println("鲇鱼可以收获了!");

}

}

//简单工厂类

public class SimpleProductFactory {

public static FreshWaterFish productFish(String fishName){

switch (fishName) {

case "grasscarp":

return new Grasscarp();

case "crap":

return new Crap();

case "catfish":

return new Catfish();

default:

System.out.println("工厂没有生产这种鱼类!");

return null;

}

}

//客户调用

public static void main(String[] args) {

FreshWaterFish fish = SimpleProductFactory.productFish("grasscarp");

if(fish!=null){

fish.grow();

fish.harvset();

}

FreshWaterFish fish2 = SimpleProductFactory.productFish("crap");

if(fish2!=null){

fish2.grow();

fish2.harvset();

}

FreshWaterFish fish3 = SimpleProductFactory.productFish("yellow");

if(fish3!=null){

fish3.grow();

fish3.harvset();

}

}

}

运行结果如下:

0ca7346da9da569f4b6b0ee86adbcf73.png

由此可以看出来,简单工厂负责了很多内部的细节,把创建对象的工作放在工厂内部,用户可以直接通过传入对应的鱼名得到鱼 的对象,而这样做有什么好处呢?

1.这让客户免除了之间创建产品对象的责任,仅仅消费产品,简单工厂模式将对象的创建与对象的使用分离开来,有利于对功能的复用和系统的维护。

2.降低代码的耦合度,比如万一场中某一种鱼突然间不生产了,如果用户之间用new关键字去创建的话,那么代码中所有的和该鱼相关的代码均得修改,而简单工厂模式由于是父类接受子类创建的对象,仅仅需要修改创建时的一行代码即可,其余方法仍可以继续使用,这也恰恰体现了java多态给我们带来的好处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值