1 简单工厂模式
简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。
优点:客户端不需要再负责对象的创建,仅仅调用工厂,工厂帮你创建需要的对象。并且把对象的创建和使用进行解耦,方便管理。
缺点:违反了开闭原则。
demo:水果工厂制作水果
public abstract class Fruit {
public abstract String getName();
}
public class Apple extends Fruit {
@Override
public String getName() {
return "苹果";
}
}
public class Orange extends Fruit {
@Override
public String getName() {
return "橙子";
}
}
public class SimpleFruitFactory {
public Fruit getFruit(String name) {
if (name.equals("apple")) {
return new Apple();
} else if (name.equals("orange")) {
return new Orange();
} else {
return null;
}
}
}
public class SimpleTest {
public static void main(String[] args) {
SimpleFruitFactory factory=new SimpleFruitFactory();
Fruit fruit= factory.getFruit("apple");
System.out.println(fruit.getName());
}
}
2 工厂方法模式
为了解决开闭原则,将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
优点:单一原则,开闭原则
缺点:添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;
demo:
public abstract class Fruit {
public abstract String getName();
}
public class Apple extends Fruit {
@Override
public String getName() {
return "苹果";
}
}
public class Orange extends Fruit {
@Override
public String getName() {
return "橙子";
}
}
public abstract class MethodFruitFactory {
public abstract Fruit getFruit();
}
public class AppleFruitFactory extends MethodFruitFactory {
@Override
public Fruit getFruit() {
return new Apple();
}
}
public class OrangeFruitFactory extends MethodFruitFactory {
@Override
public Fruit getFruit() {
return new Orange();
}
}
public class MethodTest {
public static void main(String[] args) {
MethodFruitFactory factory = new AppleFruitFactory();
Fruit fruit = factory.getFruit();
System.out.println(fruit.getName());
}
}
3 抽象工厂模式
定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口(产品族),且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
优点:当增加一个新的产品族时不需要修改原代码,满足开闭原则。
缺点:产品族扩展非常困难,严重违反开闭原则
demo:当内蒙古、河北也需要卖水果时。
public abstract class Fruit {
protected String name;
public String getName() {
return name;
}
}
public class Apple extends Fruit {
public Apple(String name) {
super.name = name;
}
}
public class Orange extends Fruit {
public Orange(String name) {
super.name = name;
}
}
public interface AbstractFruitFactory {
Fruit getFruit(String type);
}
public class HbFruitFactory implements AbstractFruitFactory {
@Override
public Fruit getFruit(String type) {
Fruit fruit = null;
if (type.equals("apple")) {
fruit = new Apple("河北苹果");
} else {
fruit = new Orange("河北橘子");
}
return fruit;
}
}
public class NMFruitFactory implements AbstractFruitFactory {
@Override
public Fruit getFruit(String type) {
Fruit fruit = null;
if (type.equals("apple")) {
fruit = new Apple("内蒙苹果");
} else {
fruit = new Orange("内蒙橘子");
}
return fruit;
}
}
public class AbsTest {
public static void main(String[] args) {
AbstractFruitFactory fruitFactory=new HbFruitFactory();
Fruit apple = fruitFactory.getFruit("apple");
System.out.println(apple.getName());
}
}