java设计模式2————工厂模式

1、工厂模式介绍:

1.1、实现了创建者与调用者的分离

1.2、详细分类:

  • 简单工厂模式

  • 工厂方法模式

  • 抽象工厂模式

1.3、所遵循的OOP原则:

  • 开闭原则:对扩展开放,对修改关闭

  • 依赖倒转原则:面向接口编程

  • 迪米特法则:只与你直接的朋友进行通信,而避免与陌生人进行通信。

1.4、核心本质

  • 实例化对象,不使用new,用工厂方法代替

  • 将调用者与我们的实现类解耦

1.5、三种模式

2、简单工厂模式

2.1、先建立汽车抽象类

package com.xgp.company.第二种_工厂模式.简单工厂模式;public interface Car {

void name();
}

2.2、制造车

制造“五凌”车

package com.xgp.company.第二种_工厂模式.简单工厂模式;public class WuLing implements Car {@Overridepublic void name() {System.out.println("五凌宏观");}}

制造“特斯拉”车

package com.xgp.company.第二种_工厂模式.简单工厂模式;public class Tesla implements Car {@Overridepublic void name() {System.out.println("特斯拉");}}

2.3、创建汽车工厂(两种方式工厂制造对像)

package com.xgp.company.第二种_工厂模式.简单工厂模式;
/**
 * 简单工厂模式,又成为静态工厂模式
 * 弊端:增加一个新产品时,如果你不修改代码,做不到
 *//**

  • 汽车工厂
    */
    public class CarFactory {
    public static Car getCar(String car) {
    if("五凌".equals(car)) return new WuLing();
    if("特斯拉".equals(car)) return new Tesla();
    return null;
    }

    /**

    public static Car getTesla() {
    return new Tesla();
    }
    }

    • 第二种方式

    • @return
      */
      public static Car getWuLing() {
      return new WuLing();
      }

2.4、建立买车类(传统方法创建对象被注释了和通过工厂创建对象)

package com.xgp.company.第二种_工厂模式.简单工厂模式;/**

  • 买车
    /
    public class Consumer {
    /
    //*

    /**

    • 简单工厂模式

    • @param args
      */
      public static void main(String[] args) {
      Car car1 = CarFactory.getCar("五凌");
      Car car2 = CarFactory.getCar("特斯拉");

      car1.name();
      car2.name();
      }
      }

    • 传统的方式

    • @param args
      //
      public static void main(String[] args) {
      //弊端:需要了解接口和所有的实现类
      Car car1 = new WuLing();
      Car car2 = new Tesla();

      car1.name();
      car2.name();
      }*/

2.5、缺点:如果要增加一个“大众”的汽车,还需要修改工厂代码

package com.xgp.company.第二种_工厂模式.简单工厂模式;/**

  • 弊端:增加实现类时需要改工厂类的代码
    */
    public class Dazhong implements Car {
    @Override
    public void name() {
    System.out.println("大众");
    }
    }

2.6、运行结果

五凌宏观
特斯拉

2.7、UML类图

3、工厂方法模式

3.1、建立汽车抽象类

package com.xgp.company.第二种_工厂模式.工厂方法模式;public interface Car {

void name();
}

3.2、创建车

创建“五凌”车

package com.xgp.company.第二种_工厂模式.工厂方法模式;public class WuLing implements Car {@Overridepublic void name() {System.out.println("五凌宏观");}}

创建“特斯拉”车

package com.xgp.company.第二种_工厂模式.工厂方法模式;public class Tesla implements Car {@Overridepublic void name() {System.out.println("特斯拉");}}

3.3、创建汽车工厂的抽象类

package com.xgp.company.第二种_工厂模式.工厂方法模式;public interface CarFactory {Car getCar();}

3.4、创建汽车工厂

创建制造“五凌”车的汽车工厂

package com.xgp.company.第二种_工厂模式.工厂方法模式;public class WuLingFactory implements CarFactory {

@Override
public Car getCar() {
    return new WuLing();
}
}

创建制造“特斯拉”车的汽车工厂

package com.xgp.company.第二种_工厂模式.工厂方法模式;public class TeslaFactory implements CarFactory {@Overridepublic Car getCar() {return new Tesla();}}

3.5、新增一辆“大众”车

新增一辆“大众”车

package com.xgp.company.第二种_工厂模式.工厂方法模式;/**

  • 弊端:增加实现类时需要改工厂类的代码
    */
    public class Dazhong implements Car {
    @Override
    public void name() {
    System.out.println("大众");
    }
    }

新增一辆“大众”车的汽车工厂

package com.xgp.company.第二种_工厂模式.工厂方法模式;public class DazhongFactory implements CarFactory {@Overridepublic Car getCar() {return new Dazhong();}}

3.6、创建消费者类

package com.xgp.company.第二种_工厂模式.工厂方法模式;/**

  • 买车
    */
    public class Consumer {
    public static void main(String[] args) {
    Car car1 = new WuLingFactory().getCar();
    Car car2 = new TeslaFactory().getCar();
    Car car3 = new DazhongFactory().getCar();

     car1.name(); car2.name(); car3.name();

    }

    //根据设计原则:工厂方法模式
    //更据实际业务:简单工厂模式
    }

3.7、弊端:增加实现类时需要改工厂类的代码

总结:

根据设计原则:工厂方法模式

更据实际业务:简单工厂模式

3.8、UML类图

4、小节

5、抽象工厂模式

5.1、该模式介绍

5.2、UML类图设计

5.3、创建生产产品种类的抽象类

package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**

  • 抽象产品工厂
    */
    public interface IProductFactory {
    //生产手机
    IPhoneProduct iphoneProduct();

    //生产路由器
    IRouterProduct routerProduct();
    }

5.4、创建手机和路由器的抽象接口

手机:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**

  • 手机接口
    */
    public interface IPhoneProduct {
    void start(); //开机
    void shutdown(); //关机
    void callup(); //打电话
    void sendSMS(); //发短信
    }

路由器:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**

  • 路由器产品接口
    */
    public interface IRouterProduct {
    void start(); //开机
    void shutdown(); //关机
    void openWifi(); //打开网络
    void setting(); //设置参数
    }

5.5、创建小米工厂

package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class XiaomiFactory implements IProductFactory {@Overridepublic IPhoneProduct iphoneProduct() {return new XiaomiPhone();}

@Override
public IRouterProduct routerProduct() {
    return new XiaomiRouter();
}
}

5.6、小米工厂制造小米手机、小米路由器

制造小米手机:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**

  • 小米手机
    */
    public class XiaomiPhone implements IPhoneProduct {
    @Override
    public void start() {
    System.out.println("开启小米手机");
    }

    @Override
    public void shutdown() {
    System.out.println("关闭小米手机");
    }

    @Override
    public void callup() {
    System.out.println("小米打电话");
    }

    @Override
    public void sendSMS() {
    System.out.println("小米发短信");
    }
    }

制造小米路由器:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**

  • 小米路由器
    */
    public class XiaomiRouter implements IRouterProduct {
    @Override
    public void start() {
    System.out.println("开启小米路由器");
    }

    @Override
    public void shutdown() {
    System.out.println("关闭小米路由器");
    }

    @Override
    public void openWifi() {
    System.out.println("小米网络");
    }

    @Override
    public void setting() {
    System.out.println("小米参数");
    }

}

5.7、创建华为工厂

package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class HuaweiFactory implements IProductFactory {@Overridepublic IPhoneProduct iphoneProduct() {return new HuaweiPhone();}

@Override
public IRouterProduct routerProduct() {
    return new HuaweiRouter();
}
}

5.8、华为工厂制造华为手机、华为路由器

制造华为手机:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**

  • 华为手机
    */
    public class HuaweiPhone implements IPhoneProduct {

    @Override
    public void start() {
    System.out.println("开启华为手机");
    }

    @Override
    public void shutdown() {
    System.out.println("关闭华为手机");
    }

    @Override
    public void callup() {
    System.out.println("华为手机打电话");
    }

    @Override
    public void sendSMS() {
    System.out.println("华为手机发短信");
    }
    }

制造华为路由器:

package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class HuaweiRouter implements IRouterProduct {@Overridepublic void start() {System.out.println("开启华为路由器");}

@Override
public void shutdown() {
    System.out.println("关闭华为路由器");
}

@Override
public void openWifi() {
    System.out.println("华为网络");
}

@Override
public void setting() {
    System.out.println("华为参数");
}
}

5.9、根据工厂制造产品

package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class Client {public static void main(String[] args) {System.out.println("小米系列产品=");//小米工厂XiaomiFactory xiaomiFactory = new XiaomiFactory();

    //小米手机
    IPhoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();

    iphoneProduct.start();
    iphoneProduct.callup();
    iphoneProduct.sendSMS();
    iphoneProduct.shutdown();

    //小米路由器
    IRouterProduct routerProduct = xiaomiFactory.routerProduct();

    routerProduct.start();
    routerProduct.openWifi();
    routerProduct.setting();
    routerProduct.shutdown();

    System.out.println("================华为系列产品=================");
    //华为工厂
    HuaweiFactory huaweiFactory = new HuaweiFactory();

    //华为手机
    iphoneProduct = huaweiFactory.iphoneProduct();

    iphoneProduct.start();
    iphoneProduct.callup();
    iphoneProduct.sendSMS();
    iphoneProduct.shutdown();

    //华为路由器
    routerProduct = huaweiFactory.routerProduct();

    routerProduct.start();
    routerProduct.openWifi();
    routerProduct.setting();
    routerProduct.shutdown();
}
}

5.10、运行结果

================小米系列产品=================
开启小米手机
小米打电话
小米发短信
关闭小米手机
开启小米路由器
小米网络
小米参数
关闭小米路由器
================华为系列产品=================
开启华为手机
华为手机打电话
华为手机发短信
关闭华为手机
开启华为路由器
华为网络
华为参数
关闭华为路由器进程完成,退出码 0

5.11、实际的UML类图

分析:

(0)

相关推荐

  • 常见的设计模式及应用场景

    一.单例模式 单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例. 优点:不会频繁地创建和销毁对象,浪费系统资源. 使用场景:IO ...

  • java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  • 设计模式----------工厂(Factory)模式

    作用 实现了创建者和调用者分离. 工厂模式核心/本质: 实例化对象不在使用new,而是用工厂方法代替. 将选择实现类,创建对象统一管理和控制,从而实现调用者和我们实现类解耦 工厂模式详细分类 1.简单 ...

  • 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种: 1.普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图:举例如下:(我们举一个发送邮件和短信 ...

  • 工厂模式

    目录 基本介绍 简单工厂模式 工厂方法模式 抽象工厂模式 基本介绍 工厂模式:属于创建模式的一种,仔细划分的话,工厂模式大致分为三种,简单工厂模式.工厂方法模式以及抽象工厂模式. 主要作用:创建对象时 ...

  • 【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)

    【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)

  • 创建型设计模式--工厂模式、抽象工厂模式

    一.小案例分析 1.功能需求: 实现一个发送信息的功能,要便于扩展与维护. (1)发送信息的工具有很多,比如短信.微信.邮件.QQ等. (2)选择某个工具进行信息发送. 2.小菜鸡去实现: (1)定义 ...

  • 如何学习23种设计模式及其思想?

    感觉设计模式是看着简单 ,但是一用就不会,23种设计模式,学的人头大,相信大家都是这样的 设计模式在程序员的面试中会被考到,通常是介绍其原理并说出优缺点.或者对比几个比较相似的模式的异同点.在笔试中可 ...

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • 图解Java设计模式之解释器模式

    图解Java设计模式之解释器模式 四则运算问题 传统方案解决四则运算问题分析 解释器模式基本介绍 解释器模式来实现四则 解析器模式在Spring框架中的源码分析 解释器模式的注意事项和细节 四则运算问 ...

  • 图解Java设计模式之备忘录模式

    游戏角色状态恢复问题 传统方案解决游戏角色恢复 传统的方式的问题分析 备忘录模式基本介绍 备忘录模式原理类图 游戏角色恢复状态实例 备忘录模式的注意事项和细节 游戏角色状态恢复问题 游戏角色有攻击力和 ...

  • 图解Java设计模式之命令模式

    智能生活项目需求 命令模式基本介绍 命令模式的原理类图 命令模式在Spring框架中JdbcTemplate应用源码分析 命令模式的注意事项和细节 智能生活项目需求 看一个具体的需求 我们买类一套智能 ...

  • 图解Java设计模式之模板模式

    豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式的注意事项和细节 豆浆制作问题 ...

  • 图解Java设计模式之桥接模式

    手机操作问题 传统方案解决手机操作问题 传统方案解决手机操作问题分析 桥接模式(Bridge)-基本介绍 桥接模式解决手机操作问题 桥接模式在JDBC中的源码解析 桥接模式的注意事项和细节 桥接模式其 ...

  • Java设计模式-中介者模式

    https://www.shengchulai.com/blog-CiTs5E8tUf.htm 前言 小时候钟爱战争片,<地道战>.<鸡毛信>.<铁道游击队>一系列 ...

  • 漫谈golang设计模式 简易工厂模式

    目前学习golang的主要需求是为了看懂TiDB的源码,下面我们复习一下简易工厂模式的思想 工厂类型分为三种,创建型模式,结构型模式,行为型模式. 简单工厂 使用场景:考虑一个简单的API设计,一个模 ...