mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

工厂模式

简单工厂,静态工厂,工厂方法,抽象工厂,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 就是把工厂写到配置文件里去了。底层还是反射

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

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

posted on 2022-09-04 22:33  万能包哥  阅读(19)  评论(0编辑  收藏  举报