工厂模式之简单工厂
工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
简单工厂(静态工厂)
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
Product:具体产品类,是简单工厂模式的创建目标。
实例如下:
1.首先创建一个水果接口(抽象产品)
public interface Fruit {
void name();
}
2.创建具体的产品,苹果和梨
public class Apple implements Fruit {
@Override
public void name() {
System.out.println("我是苹果");
}
}
public class Pear implements Fruit{
@Override
public void name() {
System.out.println("我是梨");
}
}
3.创建产品工厂
//简单工厂,静态工厂
public class SimpleFruitFactory {
//第一种
public static Fruit getFruit(String type) {
if ("apple".equals(type)) {
return new Apple();
} else if ("pear".equals(type)) {
return new Pear();
}else {
return null;
}
}
//第二种
public static Fruit getApple(){
return new Apple();
}
public static Fruit getPear(){
return new Pear();
}
}
消费者使用
public class Consumer {
public static void main(String[] args) {
//每当我们水果的时候,需要自己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.新增工厂接口
//工厂方法
public interface MethodFruitFactory {
Fruit getFruit();
}
2.对应产品的工厂
public class AppleFactory implements MethodFruitFactory {
@Override
public Apple getFruit() {
return new Apple();
}
}
public class PearFactory implements MethodFruitFactory{
@Override
public Pear getFruit() {
return new Pear();
}
}
3.消费者使用
public class Consumer {
public static void main(String[] args) {
//从对应工厂中获取
Apple apple = new AppleFactory().getFruit();
Pear pear = new PearFactory().getFruit();
apple.name();
pear.name();
}
}
部分参考https://www.jianshu.com/p/5cb52d84bd6d

浙公网安备 33010602011771号