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

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

1、工厂模式介绍:

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

1.2、详细分类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

1.3、所遵循的OOP原则:

  • 开闭原则:对扩展开放,对修改关闭
  • 依赖倒转原则:面向接口编程
  • 迪米特法则:只与你直接的朋友进行通信,而避免与陌生人进行通信。

1.4、核心本质

  • 实例化对象,不使用new,用工厂方法代替
  • 将调用者与我们的实现类解耦

1.5、三种模式

java设计模式2————工厂模式_第1张图片

2、简单工厂模式

2.1、先建立汽车抽象类

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

public interface Car {

    void name();
}

2.2、制造车

制造“五凌”车

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

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五凌宏观");
    }
}

制造“特斯拉”车

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

public class Tesla implements Car {
    @Override
    public 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;
    }

    /**
     * 第二种方式
     * @return
     */
    public static Car getWuLing() {
        return new WuLing();
    }

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

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

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

/**
 * 买车
 */
public class Consumer {
/*    *//**
     * 传统的方式
     * @param args
     *//*
    public static void main(String[] args) {
        //弊端:需要了解接口和所有的实现类
        Car car1 = new WuLing();
        Car car2 = new Tesla();

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

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

        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类图

java设计模式2————工厂模式_第2张图片

3、工厂方法模式

3.1、建立汽车抽象类

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

public interface Car {

    void name();
}

3.2、创建车

创建“五凌”车

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

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五凌宏观");
    }
}

创建“特斯拉”车

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

public class Tesla implements Car {
    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public 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类图

java设计模式2————工厂模式_第3张图片

4、小节

java设计模式2————工厂模式_第4张图片

5、抽象工厂模式

5.1、该模式介绍

java设计模式2————工厂模式_第5张图片

5.2、UML类图设计

java设计模式2————工厂模式_第6张图片 java设计模式2————工厂模式_第7张图片

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 {
    @Override
    public 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 {
    @Override
    public 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 {
    @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.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类图

java设计模式2————工厂模式_第8张图片

分析:

java设计模式2————工厂模式_第9张图片

你可能感兴趣的:(java设计模式2————工厂模式)