工厂模式
简单工厂,静态工厂,工厂方法,抽象工厂,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