1.简单工厂模式
在谈到java的工厂方法模式之前,首先来谈一谈简单工厂模式。那么什么是简单工厂模式呢?我们都知道,在现实生活当中,工厂是负责生产商品的,自然在java的设计模式之中,工厂也是负责生产商品的,不过与之不同的是,此时的商品指的是java类。在编程中,当使用new关键字创建一个类的对象时,此时该类依赖于该对象,自然他们之间的耦合度比较高,当需求变化时,我们不得不去修改此时的类的源码,很显然在某些情况下这需要非常大的工作量,此时我们就需要在起初类的设计时,对其进行封装,把那些需要改变的类封装起来,这一种思路就是简单工厂的实现方式。
从设计模式的类型上来说,简单工厂模式属于创建型模式,但并不属于java常见的23中设计模式的一种,之所以讲它,是因为它是工厂模式家族中最简单实用的一种模式,是工厂方法模式和抽象工厂模式的基础和初步实现。下面是简单工厂模式的uml类图。
简单工厂: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();
}
}
}
运行结果如下:
由此可以看出来,简单工厂负责了很多内部的细节,把创建对象的工作放在工厂内部,用户可以直接通过传入对应的鱼名得到鱼 的对象,而这样做有什么好处呢?
1.这让客户免除了之间创建产品对象的责任,仅仅消费产品,简单工厂模式将对象的创建与对象的使用分离开来,有利于对功能的复用和系统的维护。
2.降低代码的耦合度,比如万一场中某一种鱼突然间不生产了,如果用户之间用new关键字去创建的话,那么代码中所有的和该鱼相关的代码均得修改,而简单工厂模式由于是父类接受子类创建的对象,仅仅需要修改创建时的一行代码即可,其余方法仍可以继续使用,这也恰恰体现了java多态给我们带来的好处。