工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
简单工厂(静态工厂)
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
Product:具体产品类,是简单工厂模式的创建目标。
实例如下:
1.首先创建一个水果接口(抽象产品)
interface Fruit {
name();
}
2.创建具体的产品,苹果和梨
class Apple implements Fruit {
public name():void {
console.log("我是苹果");
}
}
class Pear implements Fruit{
name():void {
console.log("我是梨");
}
}
3.创建产品工厂
//简单工厂,静态工厂
class SimpleFruitFactory {
//第一种
static Fruit getFruit(type: String) {
if ("apple".equals(type)) {
return new Apple();
} else if ("pear".equals(type)) {
return new Pear();
}else {
return null;
}
}
//第二种
static Fruit getApple(){
return new Apple();
}
static Fruit getPear(){
return new Pear();
}
}
消费者使用
class Consumer {
//每当我们水果的时候,需要自己new一个,相当于自己栽培
//第一种,自己从头建造
Apple apple = new Apple();
Pear pear = new Pear();
//从工厂中取
//Apple apple2 = (Apple) SimpleFruitFactory.getApple();
// Pear pear3 = (Pear) SimpleFruitFactory.getPear();
Apple apple2 = (Apple) SimpleFruitFactory.getFruit("apple");
Pear pear3 = (Pear) SimpleFruitFactory.getFruit("pear");
}
}
总结:
- 使用简单工厂可以帮助消费者直接创建产品的责任,实现了责任的分割,但存在的问题是,一但要增加新的产品,必须要修改工厂类,不符合oop的开闭原则。
工厂方法
- 我们知道,开闭原则指的是对修改关闭,对扩展开放,而简单工厂就是为了解决这个问题,它提供一个工厂抽象接口,每一种产品的生产都会有自己的工厂,消费者从对应工厂获取产品即可,如果增加了一种产品,只需要增加对应的工厂即可,从而避免了修改,只是扩展。但是也会出现一个问题,那就是会出现大量的工厂类,代码量大。
1.新增工厂接口
//工厂方法
interface MethodFruitFactory {
Fruit getFruit();
}
2.对应产品的工厂
class AppleFactory implements MethodFruitFactory {
Apple getFruit() {
return new Apple();
}
}
class PearFactory implements MethodFruitFactory{
Pear getFruit() {
return new Pear();
}
}
3.消费者使用
class Consumer {
//从对应工厂中获取
Apple apple = new AppleFactory().getFruit();
Pear pear = new PearFactory().getFruit();
apple.name();
pear.name();
}
}