简介
工厂模式是创建型设计模式的一种。可以分成简单工厂模式、工厂方法模式、抽象方法模式,其主要作用就是将对象的实例创建抽取到工厂类中,使用者在获取对象时,只需要通过工厂去获取对象实例即可,降低系统间的耦合性。
实现
简单工厂模式
产品代码:
// 产品接口:形状
public interface Shape {
void show();
}
// 产品1:圆形
public class Circle implements Shape {
@Override
public void show() {
System.out.println("这是圆形");
}
}
//产品2:矩形
public class Rectangle implements Shape {
@Override
public void show() {
System.out.println("这是矩形");
}
}
工厂代码:
public class SimpleFactory {
public static Shape getShape(String type) {
Shape shape = null;
switch(type) {
case "circle":
shape = new Circle();
break;
case "rectangle":
shape = new Rectangle();
break;
}
return shape;
}
}
获取产品:
public class FactoryTest {
public static void main(String[] args) {
Shape shape = SimpleFactory.getShape("circle");
shape.show();
}
}
上面代码可以看到,在使用产品时并不需要使用者与产品耦合,使用者只与工厂类进行依赖,产品的获取完全通过工厂去实现。当我们新加一个同类产品时,只需要多写一个实现类,同时修改工厂类里面的内容,使用者完全不需要进行任何修改。由于简单工厂模式获取产品的方法一般都是静态的,所以简单工厂模式也称为静态工厂模式。
工厂方法模式
产品代码:
// 产品接口:形状
public interface Shape {
void show();
}
// 产品1:圆形
public class Circle implements Shape {
@Override
public void show() {
System.out.println("这是圆形");
}
}
//产品2:矩形
public class Rectangle implements Shape {
@Override
public void show() {
System.out.println("这是矩形");
}
}
工厂代码:
// 抽象工厂接口:提供一个方法去获取对象
public interface FactoryMothod {
Shape createInstance();
}
// 实现类重写去获取需要的产品
public class CircleFactory implements FactoryMothod {
@Override
public Shape createInstance() {
return new Circle();
}
}
public class RectangleFactory implements FactoryMothod {
@Override
public Shape createInstance() {
return new Rectangle();
}
}
获取产品:
public class FactoryTest {
public static void main(String[] args) {
CircleFactory circleFactory = new CircleFactory();
Shape shape = circleFactory.createInstance();
}
}
与简单工厂模式对比,工厂方法模式是通过一个接口(抽象类)里面定义一个方法去获取对象,当有同类产品新加时,我们不再需要去修改工厂里面的代码,只需要添加一个对象的实现工厂类去获取实例即可。
抽象工厂模式
产品代码1:
public interface Clothes {
void make();
}
public class BJClothes implements Clothes {
@Override
public void make() {
System.out.println("北京制造的衣服");
}
}
public class SZClothes implements Clothes {
@Override
public void make() {
System.out.println("这是深圳制造的衣服");
}
}
产品代码2:
public interface Shoes {
void makeShoes();
}
public class BJShoes implements Shoes {
@Override
public void makeShoes() {
System.out.println("这是北京制造的鞋子");
}
}
public class SZShoes implements Shoes {
@Override
public void makeShoes() {
System.out.println("这是深圳制造的鞋子");
}
}
工厂代码:
public interface AbstractFactory {
Clothes getClothes();
Shoes getShoes();
}
public class BJFactory implements AbstractFactory {
@Override
public Clothes getClothes() {
return new BJClothes();
}
@Override
public Shoes getShoes() {
return new BJShoes();
}
}
public class SZFactory implements AbstractFactory {
@Override
public Clothes getClothes() {
return new SZClothes();
}
@Override
public Shoes getShoes() {
return new SZShoes();
}
}
对比与工厂方法模式,抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口。形象的说就是不再是一个产品,他针对的是多个产品的管理,并且多个产品之间有一定的关联性。