工厂模式

文章目录

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式
  • 优点
  • 使用场景

工厂模式_第1张图片

简单工厂模式

工厂模式_第2张图片

工厂模式_第3张图片

一个工厂,当添加一个产品的时候,需要破坏工厂的方法违反开闭原则。

//car

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:16
 */
public interface Car {

    void name();
}


//Tesla


package BFactory.simple;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:17
 */
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}


//Wuling

package BFactory.simple;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:17
 */
public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}


//CarFactory


package BFactory.simple;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:19
 * 开闭原则
 * 简单工厂模式,静态工厂模式
 * 增加一个新的产品,需要修改代码
 */
public class CarFactory {


    //方法1
    //违反开闭原则:当需要添加车辆时需要加上if else进行判断
    public static Car getCar(String car){
        if(car.equals("五菱")){
            return new WuLing();
        }else if(car.equals("特斯拉")){
            return new Tesla();
        }
        return null;
    }

}


工厂方法模式

不同的产品对应不同的产品工厂

工厂模式_第4张图片

car和上面的基本一致

//CarFactory

public interface CarFactory {

    Car getCar();
}

//TeslaFactory

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:26
 */
public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

//WulingFactory

public class WulingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new WuLing();
    }
}


抽象工厂模式

工厂模式_第5张图片
工厂模式_第6张图片
//手机及其对应实现

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:42
 * 手机产品接口
 */
public interface IphoneProduct {

    void start();
    void shutdown();
    void callup();
    void sendSMS();

}

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:44
    小米手机
 */
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("小米发短信新");
    }
}

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:45
 */
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("会为发短信");
    }
}





//路由器及其实现

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:43
    路由器产品接口
 */
public interface IRouterProduct {

    void start();
    void shutdown();
    void openwifi();
    void setting();
}


/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:48
 */
public class HuaweiRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("启动huawei路由器");
    }

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

    @Override
    public void openwifi() {
        System.out.println("huawei设置wifi");
    }

    @Override
    public void setting() {
        System.out.println("huawei设置");
    }
}


/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:46
 */
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("小米设置wifi");
    }

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



//抽象工厂


/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:51
 * 抽象产品工厂
 */
public interface IproductFactory {

    //生产手机
    IphoneProduct productPhone();





    //生产路由器
    IRouterProduct productRouter();




}

//小米工厂

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:55
 */
public class XiaomiFactory implements IproductFactory {
    @Override
    public IphoneProduct productPhone() {
        return new XiaoMiPhone();
    }

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


//华为工厂

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/6/27 0027  16:56
 */
public class HuaweiFactory implements IproductFactory {
    @Override
    public IphoneProduct productPhone() {
        return new HuaweiPhone();
    }

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


优点

1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。

使用场景

: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口

你可能感兴趣的:(每天一个设计模式)