工厂模式的定义:在现实生活中,如同工厂生产产品,3D打印机打印模型一样。对象的创建通过工厂类来产生。
根据实现的模式不同,工厂模式又分为3中:
-
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为
-
工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
-
抽象工厂模式:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类
代码示例:
首先来看看第一种:
1
2
3
4
5
6
7
8
9
10
11
|
//简单工厂类根据传入的参数实现对象的实例化 public class SimpleDrinkFactory
{ public Drink
createProduct(String name){ if ( "百事可乐" .equals(name)){ return new BaiShi(); } else { return new JiaDuoBao(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public abstract class Drink
{ private String
name; public void showName(){ System.out.println(name); } public void setName(String
name){ this .name
= name; } } public class BaiShi extends Drink
{ public BaiShi()
{ super .setName( "百事可乐" ); } } public class JiaDuoBao extends Drink
{ public JiaDuoBao()
{ super .setName( "加多宝" ); } } |
1
2
3
4
5
6
7
8
|
public class SimpleMain
{ public static void main(String[]
args) { SimpleDrinkFactory
simpleDrinkFactory = new SimpleDrinkFactory(); Drink
drink = simpleDrinkFactory.createProduct( "百事可乐" ); drink.showName(); } } |
工厂方法模式:定义了一个抽象工厂类,产品的产生方法需要由工厂子类实现,且每个工厂子类只能产生一个具体产品
1
2
3
|
public abstract class Factory
{ public abstract Drink
createProduct(); } |
1
2
3
4
5
6
|
public class BaiShiFactory extends Factory
{ @Override public Drink
createProduct() { return new BaiShi(); } } |
抽象工厂模式:定义一个抽象工厂类,产品的产生方法由工厂子类实现,且每个工厂子类能产生多个具体的产品
1
2
3
|
public abstract class Factory
{ public abstract Drink
createProduct(String name); } |
1
2
3
4
5
6
7
8
|
@Override public Drink
createProduct(String name){ if ( "百事可乐" .equals(name)){ return new BaiShi(); } else { return new JiaDuoBao(); } } |
其实抽象工厂跟工厂方法模式比较模糊,他们具体区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。