首页 > 其他分享 >工厂模式

工厂模式

时间:2022-11-23 12:35:11浏览次数:42  
标签:Car class 模式 工厂 void Override new public

工厂模式:创建者(工厂)和调用者(用户)分离。

 

设计原则之:开闭原则OCP(Open Closed Principle):软件实体(包括类、模块、功能等)应该对扩展开放,但是对修改关闭。

 


 

1、简单工厂模式

例子:Client通过CarFactory拿到具体的Car对象。

实现思路:Byd和Audi实现Car接口,CarFactory(工厂)中提供静态方法创建并放回具体的Car对象,Client( 用户)通过工厂拿到所需要的Car对象。

接口Car:

public interface Car {
    void run();
}

实现类Byd:

public class Byd implements Car{
    @Override
    public void run() {
        System.out.println("Byd is running.");
    }
}

实现类Audi:

public class Audi implements Car{
    @Override
    public void run() {
        System.out.println("Audi is running.");
    }
}

工厂CarFactory:

public class CarFactory{

    //通过车名拿车
    public static Car creatCar(String name){
        if(name.equals("奥迪")){
            return new Audi();
        }else if(name.equals("比亚迪")){
            return new Byd();
        }else {
            throw new RuntimeException("没有你输入的车!");
        }
    }
    //创建奥迪
    public static Car creatAudi(){
        return new Audi();
    }
    //创建比亚迪
    public static Car creatByd(){
        return new Byd();
    }
}

客户Client:通过车工厂拿到指定的车

public class Client{
    public static void main(String[] args) {
        Car car1 = CarFactory.creatCar("奥迪");
        Car car2 = CarFactory.creatByd();
        car1.run();
        car2.run();
    }
}

运行结果:

 若要添加新的产品(车):需要新建Car的实现类、修改CarFactoy类的代码。不符合开闭原则(OCP)

2、工厂方法模式

例子:Client通过CarFactory的实现类拿到具体的Car对象。

实现思路:Byd和Audi实现Car接口,对应的车工厂(BydFactory、AudiFactory)实现CarFactory接口,工厂中提供方法creatCari()创建并放回具体的Car对象,Client( 用户)通过具体的工厂拿到所需要的Car对象。

 

 

接口Car及实现类Byd、Audi 不变。

CarFactory接口:

public interface CarFactory{
    public Car creatCar();
}

BydFactory工厂:

public class BydFactroy implements CarFactory{
    @Override
    public Car creatCar() {
        return new Byd();
    }
}

AudiFactory工厂:

public class AudiFactory implements CarFactory{
    @Override
    public Car creatCar() {
        return new Audi();
    }
}

Client客户:通过指定的工厂获取车。

public class Client{
    public static void main(String[] args) {
        Car car1 =new AudiFactory().creatCar();
        Car car2 =new BydFactroy().creatCar();
        car1.run();
        car2.run();
    }
}

运行结果:

 

 

 若要添加新的产品(车):需要新建Car的实现类、增加对应的CarFactory,不需要修改原有的代码。(符合OCP原则)

3、抽象工厂模式

它用于产品不是单个,是产品族的情况,各个部件合在一起变成一个产品。(比如一个补给包:里面有武器、食物、宠物。)

例子:Client通过SupplyPacksFactory的实现类拿到具体的宠物、食物、武器对象。

实现思路:

每个Pet、Foods、Firearms组成一个产品族,例如:高档的宠物、食物、武器组成一个高档物资包工厂(UpscaleSupplyPacksFactory)。

在SupplyPacksFactory(工厂)中创建相应的宠物、食物、武器。

比如:

客户需要一个高档的补给包。那么先创建一个UpscaleSuppluPacksFactory(高档包工厂),然后在工厂内创建具体的高档宠物、食物、武器。

客户需要一个低档的补给包。那么先创建一个LowSuppluPacksFactory(高档包工厂),然后在工厂内创建具体的低档宠物、食物、武器。

 

 

 接口  Pet  及实现类:

public interface Pet {
    void brak();//发出声音
}

class UpscalePet implements Pet{
    @Override
    public void brak() {
        System.out.println("恶龙咆哮:嗷呜嗷呜~");
    }
}

class LowPet implements Pet{
    @Override
    public void brak() {
        System.out.println("小猫咪:嘤嘤嘤~");
    }
}

接口  Foods  及实现类:

public interface Foods {
    void eatFoods();//吃的东西
}
//高档食物
class UpscaleFoods implements Foods{
    @Override
    public void eatFoods() {
        System.out.println("各种好吃的!");
    }
}
//低档食物
class LowFoods implements Foods{
    @Override
    public void eatFoods() {
        System.out.println("只有菠萝味的压缩饼干~");
    }
}

接口 Firearms  及实现类:

public interface Firearms {
    void fire();//战斗
}
//高档武器
class UpscaleFirearms implements Firearms{
    @Override
    public void fire() {
        System.out.println("爷们要战斗!爷们要战斗!爷们要战斗!");
    }
}
//低档武器
class LowFirearms implements Firearms{
    @Override
    public void fire() {
        System.out.println("小圈圈锤你胸口");
    }
}

接口  SupplyPacksFactory  及实现类:

public interface SupplyPacksFactory {
    Foods creatFoods();
    Pet creatPet();
    Firearms creatFirearms();
}
//高级背包:创建高档武器、食物、宠物
class UpscaleSupplyPacksFactory implements SupplyPacksFactory{

    @Override
    public Foods creatFoods() { return new UpscaleFoods(); }

    @Override
    public Pet creatPet() { return new UpscalePet(); }

    @Override
    public Firearms creatFirearms() { return new UpscaleFirearms(); }
}
//低级背包:创建低档武器、食物、宠物
class LowSupplyPacksFactory implements SupplyPacksFactory{

    @Override
    public Foods creatFoods() { return new LowFoods(); }

    @Override
    public Pet creatPet() { return new LowPet(); }

    @Override
    public Firearms creatFirearms() { return new LowFirearms(); }
}

用户来试试:

public class Client{
    public static void main(String[] args) {
        //创建一个高档背包工厂
        SupplyPacksFactory packsFactory = new UpscaleSupplyPacksFactory();
        //从工厂里拿出高档武器
        Firearms firearms = packsFactory.creatFirearms();
        //试试武器
        firearms.fire();

        //创建一个低档背包工厂
        SupplyPacksFactory packsFactory1 = new LowSupplyPacksFactory();
        //拿个宠物出来
        Pet pet =packsFactory1.creatPet();
        //试试宠物
        pet.brak();
        //看看吃的
        packsFactory1.creatFoods().eatFoods();

    }
}

运行结果:

 

若要添加新的产品族(补给包):新建对应的SupplyPacksFactory实现类即可,不需要修改原有的代码。(符合OCP原则)

标签:Car,class,模式,工厂,void,Override,new,public
From: https://www.cnblogs.com/lurenjia-bky/p/16916993.html

相关文章

  • 软件设计模式白话文系列(十四)策略模式
    1、模式描述定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。在Java中,从JDK1.8开始支持函数式编程,就是策略模式......
  • 数字展馆虚拟迎宾讲解员,开启展馆全新讲解模式!
    “虚拟迎宾讲解员”是一种利用数字技术与定制内容相结合的互动系统,是当下数字互动展厅中不可少的多媒体展项,它通过多媒体技术、虚拟成像等技术再现物体的真实三维图像,将解说......
  • 【数据库系统原理与设计】(五)关系数据理论与模式求精
    五. 关系数据理论与模式求精5.1问题提出 1. 数据冗余导致的问题: 冗余存储:信息被重复存储,导致浪费大量存储空间更新异常:当重复信息的一个副本被修改,所有副本都必......
  • CPP2nd CRTP Facade 模式
    书中源码不全,看看我这个?#include<iostream>#include<type_traits>#include<vector>#include<iterator>template<typenameDerived,typenameValue,typenameCa......
  • “灯塔工厂”示范中国制造业未来
    “灯塔工厂”示范中国制造业未来工人在阿里巴巴犀牛智造工厂车间忙碌(2020年9月摄)张璇摄/本刊◇由树根互联打造的“根云平台”根据工厂里36000多个数据采集点收集的工业......
  • JAVA---单例模式
    单例模式单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为饿汉式和懒汉式。1.饿汉式饿汉式。顾名思义,该......
  • c语言的钩子与C++的策略模式
    1.c语言钩子:特性模块:功能函数,调用注册函数主线模块:注册函数,定义钩子(通常是全局变量),调用钩子 2.c++策略模式:特性模块:从策略基类派生一个新特性类,实例化对象并调用se......
  • vue-router的两种模式实现原理
    1.hash模式的简单实现2.history模式的简单实现......
  • 单例模式
    单例模式指的是:此类在任何时候都只存在一个对象:实现步骤:1、构造器私有化。2、提供获取对象的方法getInstance()。分类:饿汉式:在加载类的时候就创建对象。......
  • webpack - 开发模式
    1.设置webpack为开发模式设置模式(mode:development/production)设置sourcemaps(devtool:'inline-source-map')constpath=require('path');constHtmlWebpa......