工厂模式

Posted EdgarStudy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

核心本质:

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

三种模式:

  • 简单工厂模式
    • 用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)
  • 工厂方法模式
    • 用来生产同一等级结构中的任意产品(对于增加新的产品,不需要修改已有代码)
  • 抽象工厂模式
    • 围绕一个超级工厂创建其它工厂。该超级工厂又称为其它工厂的工厂。

小结:

  • 简单工厂模式
    • 虽然某种程度上不符合设计原则,但实际使用最多
  • 工厂方法模式
    • 不修改已有类的情况下,通过增加新的工厂类实现扩展
  • 抽象工厂模式
    • 不可以增加产品,可以增加产品族

同一等级结构:同一种类型的产品。比如车:五菱宏光、特斯拉、保时捷....,这些东西都可以称之为车

产品族:不同类型的产品合并在一起叫产品族。比如:小米可以生产手机、路由器、笔记本....,这些东西合起来称之为产品族

简单工厂模式

原理:

27URQP.png

代码实现:

Car.java

package com.edgar.factory.simple;

public interface Car {
    void name();
}

Tesla.java

package com.edgar.factory.simple;

public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

Wuling.java

package com.edgar.factory.simple;

public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

CarFactory.java

package com.edgar.factory.simple;
//简单工厂模式(又叫静态工厂模式)
//违反开闭原则,没新增一款车,都需要修改CarFactory类
public class CarFactory {

    public static Car getCar(String car){
        if("五菱宏光".equals(car)){
            return new Wuling();
        }else if("特斯拉".equals(car)){
            return new Tesla();
        }else {
            return null;
        }
    }
}

Customer.java

package com.edgar.factory.simple;


public class Customer {

    public static void main(String[] args) {
        //自己new
        //Car car = new Wuling();
        //Car car2 = new Tesla();

        //使用工厂
        Car car =CarFactory.getCar("五菱宏光");
        Car car2 =CarFactory.getCar("特斯拉");

        car.name();
        car2.name();
    }
}

工厂方法模式

原理:

27yEIf.png

代码实现:

Car.java

package com.edgar.factory.method;

public interface Car {
    void name();
}

Tesla.java

package com.edgar.factory.method;

public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

Wuling.java

package com.edgar.factory.method;

public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

CarFactory.java

package com.edgar.factory.method;

// 工厂方法模式
public interface CarFactory {

    Car getCar();
}

TeslaFactory.java

package com.edgar.factory.method;

public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

WulingFactory.java

package com.edgar.factory.method;

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

抽象工厂模式

原理:

2Hp7Sf.png

IphoneProduct.java

package com.edgar.factory.abstract1;

//手机产品接口
public interface IphoneProduct {

    void start();
    void shutDown();
    void callUp();
    void sendSMS();

}

HuaweiPhone.java

package com.edgar.factory.abstract1;

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("华为手机发短信");
    }
}

XiaomiPhone.java

package com.edgar.factory.abstract1;

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("小米手机发短信");
    }
}

IRouterProduct.java

package com.edgar.factory.abstract1;

// 路由器产品接口
public interface IRouterProduct {

    void start();
    void shutDown();
    void openWifi();
    void setting();
}

HuaweiRouter.java

package com.edgar.factory.abstract1;

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("启动华为Wifi");
    }

    @Override
    public void setting() {
        System.out.println("华为路由器设置");
    }
}

XiaomiRouter.java

package com.edgar.factory.abstract1;

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("小米路由器设置");
    }
}

IProductFactory.java

package com.edgar.factory.abstract1;

//抽象产品工厂
public interface IProductFactory {

    //生产手机
    IphoneProduct iphoneProduct();

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

HuaweiFactory.java

package com.edgar.factory.abstract1;

public class HuaweiFactory implements IProductFactory{
    @Override
    public IphoneProduct iphoneProduct() {
        return new HuaweiPhone();
    }

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

XiaomiFactory.java

package com.edgar.factory.abstract1;

public class XiaomiFactory implements IProductFactory{
    @Override
    public IphoneProduct iphoneProduct() {
        return new XiaomiPhone();
    }

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

Customer.java

package com.edgar.factory.abstract1;

public class Customer {

    public static void main(String[] args) {
        System.out.println("==============小米产品================");
        IProductFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
        iphoneProduct.start();

        IRouterProduct iRouterProduct = xiaomiFactory.iRouterProduct();
        iRouterProduct.start();

        System.out.println("==============华为产品================");
        IProductFactory huaweiFactory = new HuaweiFactory();
        IphoneProduct iphoneProduct1 = huaweiFactory.iphoneProduct();
        iphoneProduct1.start();

        IRouterProduct iRouterProduct1 = huaweiFactory.iRouterProduct();
        iRouterProduct1.start();

    }
}

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

C++工厂模式(简单工厂工厂方法抽象工厂)