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


    单例模式

     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

  • 相关阅读:
    webpack学习总结
    jquery弹出下拉列表插件(实现kindeditor的@功能)
    html meta标签使用总结
    Techparty-广州Javascript技术专场(学习分享)
    一个三年工作经验的软件工程师的经验之谈
    cf--------(div1)1A. Theatre Square
    离线网页制作器(beta1.0)
    uva---(11549)CALCULATOR CONUNDRUM
    CF---(452)A. Eevee
    Uva----------(11078)Open Credit System
  • 原文地址:https://www.cnblogs.com/holoyong/p/7296577.html
Copyright © 2020-2023  润新知