前言
很多人看源码没有头绪,一个很大的原因在于对于23种我们约定俗成的设计模式所知甚少,分析源码之前,有必要说一下设计模式。
设计模式的关系
根据上图的关系,我们可以看出以下几个模式是跟其他的模式关联相当密切的,也就是我们需要重点掌握的几种设计模式:
- 工厂模式(包括工厂方法模式,抽象工厂模式)
- 单例模式
- 原型模式
- 代理模式
- 策略模式
- 模板模式
- 委派模式
- 适配器模式
- 装饰器模式
- 观察者模式
今天讲一下23种设计模式中的工厂模式。
工厂模式的种类
工厂模式分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
为了便于理解,这里做一个小案例:
1、首先制造一个牛奶类:
public interface Milk {
/**
* 获取一个标准产品
* @return
*/
public String getName();
}
2、然后制造很多的具体牛奶类,实现这个接口:
蒙牛类:
public class Mengniu implements Milk {
public String getName() {
return "蒙牛";
}
}
特仑苏类:
public class Telunsu implements Milk {
public String getName() {
return "特仑苏";
}
}
伊利类:
public class Yili implements Milk {
public String getName() {
return "伊利";
}
}
简单工厂模式
1、创建一个简单工厂
public class SimpleFactory {
public Milk getMilk(String name){
if("特仑苏".equals(name)){
return new Telunsu();
}else if("伊利".equals(name)){
return new Yili();
}else if("蒙牛".equals(name)){
return new Mengniu();
}else {
System.out.println("不能生产您所需的产品");
return null;
}
}
}
2、测试简单工厂模式
public static void main(String[] args) {
//这个new的过程实际上一个比较复杂的过程
//有人民币及不需要自己new了
System.out.println(new Telunsu().getName());
//小作坊式的生产模式
//用户本身不再关心生产的过程,而只需要关心这个结果
//假如:特仑苏、伊利、蒙牛
//成分配比都是不一样的
SimpleFactory factory = new SimpleFactory();
//把用户的需求告诉工厂
//创建产品的过程隐藏了,对于用户而且完全不清楚是怎么产生的
System.out.println(factory.getMilk("特仑苏").getName());
}
工厂方法模式
1、创建工厂
public interface Factory {
//工厂必然具有生产产品技能,统一的产品出口
Milk getMilk();
}
2、创建工厂实现类
public class MengniuFactory implements Factory {
public Milk getMilk() {
return new Mengniu();
}
}
public class TelunsuFactory implements Factory {
public Milk getMilk() {
return new Telunsu();
}
}
public class YiliFactory implements Factory {
public Milk getMilk() {
return new Yili();
}
}
3、测试工厂方法模式
public static void main(String[] args) {
//System.out.println(new Factory().getMilk(););
//货比三家
//不知道谁好谁好谁坏
//配置,可能会配置错
Factory factory = new SanluFactory();
System.out.println(factory.getMilk());
}
抽象工厂模式
抽象工厂是用户的主入口,在Spring中应用得最为广泛的一种设计模式 ,易于扩展!
1、创建抽象工厂
public abstract class AbstractFactory {
//公共的逻辑
//方便于统一管理
/**
* 获得一个蒙牛品牌的牛奶
* @return
*/
public abstract Milk getMengniu();
/**
* 获得一个伊利品牌的牛奶
* @return
*/
public abstract Milk getYili();
/**
* 获得一个特仑苏品牌的牛奶
* @return
*/
public abstract Milk getTelunsu();
}
2、创建抽象工厂实现类
public class MilkFactory extends AbstractFactory {
@Override
public Milk getMengniu() {
return new Mengniu();
}
@Override
public Milk getYili() {
return new Yili();
}
@Override
public Milk getTelunsu() {
return new Telunsu();
}
}
3、测试抽象工厂模式
public static void main(String[] args) {
MilkFactory factory = new MilkFactory();
//对于用户而言,更加简单了
//用户只有选择的权利了,保证了程序的健壮性
System.out.println(factory.getMengniu());
}
资源分享
工厂模式代码分享:https://github.com/harrypottry/steamvip
23种设计模式pdf:https://pan.baidu.com/s/1vT98B07PYlNNi_ua-E-ROg[分享码:2hxs