概述
在我看来简单工厂模式与策略模式是十分相似的,都是针对不同情况而产生不用的策略或是实体。因为十分相似的缘故,写在同一篇文章里比较合适。首先来看看简单工厂模式。
简单工厂模式
介绍
简单工厂属于创建型模式,也叫静态工厂方法模式,我们只需要知道要生产什么样的实体对象,不需要知道生产这个实体对象需要哪些具体的参数
作用
将实例化操作与使用实例对象的操作分开
避免显示指定,解耦。
具体实现
首先是工厂类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Factory{
	//根据不用的要求生产生产什么样的产品
	public static Product createProduct(String modeStr){
		switch(modeStr){
			case "A":
			return new ProductA();
			case "B":
			return new ProductB();
			case "C":
			return new ProductC();
			default:
                return null;
		}
	}
}
各种产品实体肯定要实现Product接口啦:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27interface Product{
	public void create();//被生产
}
... ...
class ProductA implements Product{
	
	public void create(){
		Log.e(Tag,"创建了A产品呀");
	}
}
... ...
class ProductB implements Product{
	
	public void create(){
		Log.e(Tag,"创建了C产品呀");
	}
}
... ...
class ProductC implements Product{
	
	public void create(){
		Log.e(Tag,"创建了C产品呀");
	}
}
在其他地方使用工厂类来生产产品1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34public class SimpleFactoryPattern {
    public static void main(String[] args){
        Factory mFactory = new Factory();
        //客户要产品A
        try {
        //调用工厂类的静态方法 & 传入不同参数从而创建产品实例
            mFactory.createProduct("A").create();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }
        //客户要产品B
        try {
            mFactory.createProduct("B").create();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }
        //客户要产品C
        try {
            mFactory.createProduct("C").create();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }
        //客户要产品D
        try {
            mFactory.createProduct("D").create();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }
    }
}
结果:1
2
3
4创建了A产品呀
创建了B产品呀
创建了C产品呀
没有这一类产品
小结
上面已经已经说了简单工厂模式只需关心我要什么样的产品,而不需要关系怎么生产这产品。能实现产品的操作与产品的创建解耦。这是它的优点。
同时,现在已经能生产ABC这些产品,但是一旦要新添加产品ProductD的话,就必须修改工厂类,违反设计模式的开闭原则,这也是它的缺点。
日常开发要视情况而定。
策略模式
开头说简单工厂模式与策略模式十分相似,到底哪些地方相似?
介绍
定义了一系列的算法策略,放在一个策略类中,根据不同情况而选择不同的策略(简单模式是根据不同的需要生产不同的产品)。
具体实现
| 1 | class Context_SalesMan{ | 
定义Strategy1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27interface Strategy{
	public void show();
}
... ...
class StrategyA implements Strategy{
	override
	public void show(){
		Log.e(Tag,"使用了A策略");
	}
}
... ...
class StrategyB implements Strategy{
	override
	public void show(){
		Log.e(Tag,"使用了B策略");
	}
}
... ...
class StrategyC implements Strategy{
	override
	public void show(){
		Log.e(Tag,"使用了C策略");
	}
}
在其他地方使用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class StrategyPattern{
  public static void main(String[] args){
        Context_SalesMan mSalesMan ;
		
        mSalesMan =  Context_SalesMan SalesMan("A");
        mSalesMan.SalesManShow();
        
        mSalesMan =  Context_SalesMan SalesMan("B");
        mSalesMan.SalesManShow();
        mSalesMan =  Context_SalesMan SalesMan("C");
        mSalesMan.SalesManShow();  
  }   
}
结果:1
2
3Log.e(Tag,"使用了A策略");
Log.e(Tag,"使用了B策略");
Log.e(Tag,"使用了C策略");
小结
从上面的代码中可以看出根据不同情况来实例化具体的策略,假如我们不知道全部的策略,SalesMan(String festival)里面传入了“D”,这在后面肯定会引起异常错误。所以要必须知道所有的策略类。
当添加一个新的策略时,只需要新增一个具体的策略类即可,无须更改原有的代码。
总结
主要介绍了简单工厂模式和策略模式,其他设计模式可参看:
设计模式(一):简介及单例模式