设计模式-单例模式、工厂模式

单例模式

 1     //最简单、有效的单例实现
 2     private static class SingleWithHolder {
 3         private static class Holder{
 4             private static SingleWithHolder instance = new SingleWithHolder();
 5         }
 6         //通过SingleWithHolder.instance()得到单例
 7         private static SingleWithHolder instance() {
 8             return Holder.instance;
 9         }
10     }
 1     //使用enum实现单例
 2     private enum SingleWithEnum{
 3         //通过SingleWithEnum.INSTANCE.instance()得到单例
 4         INSTANCE{
 5             @Override
 6             public SingleTest instance() {
 7                 return instance;
 8             }
 9         };
10         protected SingleTest instance;
11         //enum的构造器必须为private
12         private SingleWithEnum() {
13             instance = new SingleTest();
14         }
15         //Enum为抽象类
16         public abstract SingleTest instance();
17     }
 1     //经典的双重检查锁
 2     private static class SingleWithDoubleCheck{
 3         private static volatile SingleSample instance;
 4         public static SingleSample instance() {
 5             if (instance == null) {
 6                 synchronized (SingleWithDoubleCheck.class) {
 7                     if (instance == null) {
 8                         //如果不将instance声明为volatile,这里就会出现问题,instance = new SingleSample();的执行逻辑大致分三步:
 9                         // 1分配对象空间、2赋初值、3返回对象引用,
10                         // 如果经过指令重排序后执行顺序变成了1、3、2,就会出现可以获得非空对象,但对象内字段为零值的情况,而volatile可以禁止指令重排序。
11                         instance = new SingleSample();
12                     }
13                 }
14             }
15             return instance;
16         }
17     }

工厂模式

工厂模式可以屏蔽产品生产的细节(工厂生产产品本身是很复杂的,可能又会涉及其他产品的生产,这些细节都由工厂来保证),同时将产品的具体实现与客户解耦,工厂是用来生产产品的,如何提升工厂的扩展性(方便的加入新工厂、新产品)是工厂模式要注意的。

简单工厂模式

 1 //产品抽象
 2 abstract class BMW {  
 3     public BMW(){  
 4           
 5     }  
 6 }  
 7 //具体产品  
 8 public class BMW320 extends BMW {  
 9     public BMW320() {  
10         System.out.println("制造-->BMW320");  
11     }  
12 }  
13 public class BMW523 extends BMW{  
14     public BMW523(){  
15         System.out.println("制造-->BMW523");  
16     }  
17 }  
18 //产品工厂,负责生产所有产品
19 public class Factory {  
20     public BMW createBMW(int type) {  
21         switch (type) {  
22           
23         case 320:  
24             return new BMW320();  
25   
26         case 523:  
27             return new BMW523();  
28   
29         default:  
30             break;  
31         }  
32         return null;  
33     }  
34 }  
35 //客户
36 public class Customer {  
37     public static void main(String[] args) {  
38         Factory factory = new Factory();  
39         //类似spring中BeanFactory的getBean
40         BMW bmw320 = factory.createBMW(320);  
41         BMW bmw523 = factory.createBMW(523);  
42     }  
43 }  

工厂方法模式

 1 //产品抽象
 2 abstract class BMW {  
 3     public BMW(){  
 4           
 5     }  
 6 }  
 7 //具体产品
 8 public class BMW320 extends BMW {  
 9     public BMW320() {  
10         System.out.println("制造-->BMW320");  
11     }  
12 }  
13 public class BMW523 extends BMW{  
14     public BMW523(){  
15         System.out.println("制造-->BMW523");  
16     }  
17 }  
18 //工厂抽象
19 interface FactoryBMW {  
20     BMW createBMW();  
21 }  
22 //具体工厂
23 public class FactoryBMW320 implements FactoryBMW{  
24   
25     @Override  
26     public BMW320 createBMW() {  
27   
28         return new BMW320();  
29     }  
30   
31 }  
32 public class FactoryBMW523 implements FactoryBMW {  
33     @Override  
34     public BMW523 createBMW() {  
35   
36         return new BMW523();  
37     }  
38 }  
39 //客户
40 public class Customer {  
41     public static void main(String[] args) {  
42         //类似spring中ClassPathXmlApplicationContext和FileSystemXmlApplicationContext都继承了抽象类AbstractXmlApplicationContext,二者的差异仅在于路径解析
43         FactoryBMW320 factoryBMW320 = new FactoryBMW320();  
44         BMW320 bmw320 = factoryBMW320.createBMW();  
45   
46         FactoryBMW523 factoryBMW523 = new FactoryBMW523();  
47         BMW523 bmw523 = factoryBMW523.createBMW();  
48     }  
49 }  

抽象工厂模式

现在要求为每个车型生产配件

 1 //发动机以及型号    
 2 public interface Engine {    
 3   
 4 }    
 5 public class EngineA extends Engine{    
 6     public EngineA(){    
 7         System.out.println("制造-->EngineA");    
 8     }    
 9 }    
10 public class EngineBextends Engine{    
11     public EngineB(){    
12         System.out.println("制造-->EngineB");    
13     }    
14 }    
15   
16 //空调以及型号    
17 public interface Aircondition {    
18   
19 }    
20 public class AirconditionA extends Aircondition{    
21     public AirconditionA(){    
22         System.out.println("制造-->AirconditionA");    
23     }    
24 }    
25 public class AirconditionB extends Aircondition{    
26     public AirconditionB(){    
27         System.out.println("制造-->AirconditionB");    
28     }    
29 }   
30 //工厂抽象
31 public interface AbstractFactory {    
32     //制造发动机  
33     public Engine createEngine();  
34     //制造空调   
35     public Aircondition createAircondition();   
36 }    
37   
38   
39 //宝马320系列配件工厂
40 public class FactoryBMW320 implements AbstractFactory{    
41         
42     @Override    
43     public EngineA createEngine() {      
44         return new EngineA();    
45     }    
46     @Override    
47     public AirconditionA createAircondition() {    
48         return new AirconditionA();    
49     }    
50 }    
51 //宝马523系列配件工厂    
52 public class FactoryBMW523 implements AbstractFactory {    
53     
54      @Override    
55     public EngineB createEngine() {      
56         return new EngineB();    
57     }    
58     @Override    
59     public AirconditionB createAircondition() {    
60         return new AirconditionB();    
61     }    
62 }   
63 //客户
64 public class Customer {    
65     public static void main(String[] args){    
66         //生产宝马320系列配件  
67         FactoryBMW320 factoryBMW320 = new FactoryBMW320();    
68         factoryBMW320.createEngine();  
69         factoryBMW320.createAircondition();  
70             
71         //生产宝马523系列配件    
72         FactoryBMW523 factoryBMW523 = new FactoryBMW523();    
73         factoryBMW320.createEngine();  
74         factoryBMW320.createAircondition();  
75     }    
76 }  

工厂方法只能生产一种产品,而抽象工厂可以生产多种产品。

参考:http://blog.csdn.net/jason0539/article/category/3092021

原文地址:https://www.cnblogs.com/holoyong/p/7296577.html