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

工厂模式

时间:2022-09-04 22:46:58浏览次数:52  
标签:Car factory 模式 工厂 go new public

工厂模式

简单工厂,静态工厂,工厂方法,抽象工厂,springIOC

工厂定义:任何可以产生对象的方法或者类,都可以称之为工厂

单例也是一种工厂

不可咬文嚼字,死扣概念

为什么有了new以后,还要工厂?

​ 灵活控制生成过程

​ 权限,修饰,日志...

需求1:某人每天需要出行,不定期换交通工具,如今天坐飞机,明天坐车,后天...说白了,实现任意定制交通工具

简单看一下代码

package org.ali.factory.factoryMethod;

/**
 * Author: lury
 * Date: 2022-09-04 19:18
 */
public class Main {
    public static void main(String[] args) {
//        Car car = new Car();
//        car.go();

        Plane plane = new Plane();
        plane.go();

    }
}

package org.ali.factory.factoryMethod;

/**
 * Author: lury
 * Date: 2022-09-04 19:19
 */
public class Car {

    public void go() {
        System.out.println("car go...");
    }
}

package org.ali.factory.factoryMethod;

/**
 * Author: lury
 * Date: 2022-09-04 19:22
 */
public class Plane {
    public void go() {
        System.out.println("plane go...");
    }
}

通过这个Moveable接口实现了任意定制交通工具

每换一种交通工具就得新new一个对象,这是不太灵活的,那怎么办?肯定第一就是想接口,对不对

改成下面这样

package org.ali.factory.factoryMethod;

/**
 * Author: lury
 * Date: 2022-09-04 19:18
 */
public class Main {
    public static void main(String[] args) {
//        Car car = new Car();
//        car.go();

//        Plane plane = new Plane();
//        plane.go();

        Moveable m = new Plane();
        m.go();

    }
}


public interface Moveable {
    void go();
}

public class Car implements Moveable{
    public void go() {
        System.out.println("car go...");
    }
}

public class Plane implements Moveable{
    public void go() {
        System.out.println("plane go...");
    }
}

需求二:任意定制生产过程

上面案例是通过new出来对象,每次需要改new的工具,还是不够灵活,而且new出来的对象权限也无法控制

先认识一下简单工厂,实际并没有什么用处

package org.ali.factory.factoryMethod;

/**
 * Author: lury
 * Date: 2022-09-04 20:51
 * 简单工厂的可扩展性不太好
 */
public class SimpleVihicleFactory {
    public Car createCar(){
        // before processing
        return new Car();
    }

    public Plane createPlane() {
        return new Plane();
    }
}

看看定制化工厂

public class CarFactory {
    public Moveable create() {
        System.out.println("a car created");
        return new Car();
    }
}

好像也并没有什么卵用

最后搞一下抽象工厂

先看这样一个案例,一个现代人开车,拿武器射击,吃面包。一个魔法师驾着扫帚,拿魔法棒,吃蘑菇。这样就产生了产品族

我们要不要逐一去new出来调用呢?这样客户端代码修改太大了,使用抽象工厂大大减少了客户端代码的修改变化,设计起来

麻烦一点,但是使用起来就很方便

现代人族,魔法师族,火星族...

抽象工厂就是解决产品族问题

public class Main {
    public static void main(String[] args) {
        // AbstractFactory factory = new ModernFactory();
        AbstractFactory factory = new MagicFactory();// 主要修改工厂就行了
        Foot foot = factory.createFoot();
        foot.printName();

        Vihicle vihicle = factory.createVihicle();
        vihicle.go();

        Weapon weapon = factory.createWeapon();
        weapon.shoot();
    }
}

在单一维度上使用定制化工厂好拓展,在产品族使用抽象工厂比较好,有没有一种比较完美的方案呢?

更好的解决方案,spring提供的bean工厂,spring ioc 就是把工厂写到配置文件里去了。底层还是反射

首先问一下,如何运用工厂模式呢?像风格之类的,如颜色为黑,字体为黑体等为一组,其他为一组,这样可以设计为抽象工厂

使用工厂方法实现一键换皮肤,嘿嘿

标签:Car,factory,模式,工厂,go,new,public
From: https://www.cnblogs.com/mybloger/p/16656367.html

相关文章

  • Singleton_单例模式:
    Singleton_单例模式:常规实现: publicclassSingleton{ privateSingleton(){ } privatefinalstaticSingletonINSTANCE=newSingleton(); publicstaticSingl......
  • 设计模式究竟是什么
    什么是设计模式?设计模式是一套由前辈总结的代码设计经验,经过反复的实践,根据这套理论,大家可以写出易维护、易拓展、复用率高的代码,经常被面向对象语言的开发者使用。Java......
  • docker序列之网络模式
    docker网络模式用dockerrun允许docker容器时,可以使用--net选项来指定容器的网络模式,docker可以有以下4中网络模式1、host模式:使用--net=host指定host模式是和宿主......
  • 结构型模式——外观模式
    一、什么是外观模式?外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一的接口(你可以将其理......
  • 策略模式
    策略模式应用场景:comparator先看需求:实现一个排序器,要求可以对传入的任意类型数组都进行排序猫数组排序,狗数组排序,只要有大小关系就可以排序,而这个大小关系是我们人为......
  • 火狐浏览器f12不显示firebug开发者模式问题总结
    大家在用火狐浏览器获取页面元素的时候是不是经常用firebug开发者模式?但是我们发现一个问题,F12按下后并没有显示firebug开发者模式,检查了一下firebug和firepath插件发现都......
  • 单例模式
    单例模式应用场景:在内存中只有一个实例,如xxxFactory,xxxMgr有八种单例,完美无缺的有两种,常用的却并非这两种1、packageorg.ali.singleton;/***Author:lury*Da......
  • 开启win10测试模式
    1.鼠标右键2.管理员shell3.命令4.重启电脑......
  • 如何将数据库设置为单用户模式 (SQL Server Management Studio 2008)
    即使设置此选项的用户已注销,数据库仍保持单用户模式。这时,其他用户(但只能是一个)可以连接到数据库。将数据库设置为单用户模式在对象资源管理器中,连接到SQLServer数......
  • 【设计模式】Java设计模式 -工厂模式
    【设计模式】Java设计模式-工厂模式......