您的位置:首页 > 编程语言 > Java开发

设计模式之工厂模式

2017-03-21 00:31 169 查看

0. 概述

工厂模式定义了一个创建对象的接口来创建对象,用工厂方法代替new操作。但是由子类决定要实例化的类是哪一个。工厂方法把实例化的工作推迟到子类中去实现。工厂模式包括工厂方法模式和抽象工厂模式,抽象工厂模式是工厂方法模式的扩展。

工厂模式适用场景:(1)有一组类似的对象需要创建;(2)在编码时不能预见需要创建哪种类的实例;(3)考虑系统扩展性,松耦合,降低对象之间的依赖关系。

1. 工厂方法模式

假如你有一家蛋糕店,售卖两种风味蛋糕。

//蛋糕抽象类
public abstract class Cake {
public abstract void getCake();
}
//草莓风味蛋糕
public class StrawberryCake extends Cake {
public void getCake() {
System.out.println("This is strawberry cake.");
}
}
//芒果风味蛋糕
public class MangoCake extends Cake {
public void getCake() {
System.out.println("This is mango cake.");
}
}
//蛋糕工厂类
public class CakeFactory {
public Cake createCake(String type) {
if ("strawberry".equals(type)) {
return new StrawberryCake();
} else if ("mango".equals(type)){
return new MangoCake();
}
return null;
}
}
public class DemoTest {
public static void main(String[] args) {
CakeFactory factory = new CakeFactory();

//创建草莓风味蛋糕
Cake strawberryCake = factory.createCake("strawberry");
strawberryCake.getCake();

//创建芒果风味蛋糕
Cake mangoCake = factory.createCake("mango");
mangoCake.getCake();
}
}

2. 抽象工厂模式

随着市场需求的不断变化,冰淇淋逐渐受到顾客的青睐,蛋糕店准备制作销售冰淇淋。同样有草莓风味冰淇淋和芒果风味冰淇淋两种产品。这时就需要不同的工厂,负责产生不同风味的产品。我们需要将工厂类抽象化,草莓风味工厂和芒果风味工厂继承这个抽象工厂类。
//冰淇淋抽象类
public abstract class Cream {
public abstract void getCream();
}
//草莓风味冰淇淋
public class StrawberryCream extends Cream {
public void getCream() {
System.out.println("This is strawberry ice cream.");
}
}
//芒果风味冰淇淋
public class MangoCream extends Cream {
public void getCream() {
System.out.println("This is mango ice cream.");
}
}
//抽象工厂类
public abstract class AbstractFactory {
public abstract Cake createCake();
public abstract Cream createCream();
}
//草莓风味工厂类
public class StrawberryFactory extends AbstractFactory {
public Cake createCake() {
return new StrawberryCake();
}

public Cream createCream() {
return new StrawberryCream();
}
}
//芒果风味工厂类
public class MangoFactory extends AbstractFactory {
public Cake createCake() {
return new MangoCake();
}

public Cream createCream() {
return new MangoCream();
}
}
public class DemoTest {
public static void main(String[] args) {
//创建草莓风味蛋糕
AbstractFactory SBFactory = new StrawberryFactory();
Cake strawberryCake = SBFactory.createCake();
strawberryCake.getCake();

//创建芒果风味冰淇淋
AbstractFactory MGFactory = new MangoFactory();
Cream mangoCream = MGFactory.createCream();
mangoCream.getCream();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息