zoukankan      html  css  js  c++  java
  • 设计模式学习笔记(一)之工厂模式、单例模式

    一、工厂模式

    (1)简单工厂模式:

    1 public interface IProduct {
    2 
    3     public void saleProduct();
    4 
    5 }

    创建一个产品接口,有一个卖产品的方法。

    1 public class ProductA implements IProduct{
    2 
    3     public void saleProduct(){
    4         System.out.println("汉堡");
    5     }
    6 }

    产品A实现产品接口,卖汉堡。

    1 public class ProductB implements IProduct {
    2 
    3     @Override
    4     public void saleProduct() {
    5         // TODO Auto-generated method stub
    6         System.out.println("薯条");
    7     }
    8 
    9 }

    产品B实现产品接口,卖薯条。

     1 public class Creator {
     2 
     3     public IProduct createFactory(int i){
     4         switch(i){
     5             case 1:
     6                 return new ProductA();
     7             case 2:
     8                 return new ProductB();
     9             default:
    10                 return null;
    11         }        
    12     }
    13     
    14 }

    创造者是简单工厂模式的核心:返回值类型是IProduct接口,通过测试类传来的形参确定返回哪个对象。

    1 public class TestProduct {
    2 
    3     public static void main(String[] args) {
    4         Creator c=new Creator();
    5         c.createFactory(2).saleProduct();
    6     }
    7 }

    测试类:输出薯条。

    (2)方法工厂模式:

    (图片来自于网络)

    1 public interface Light {
    2 
    3     public void TurnOn();
    4     public void TurnOff();
    5 }

    创建一个产品接口。

     1 public class TubeLight implements Light {
     2 
     3     @Override
     4     public void TurnOn() {
     5         // TODO Auto-generated method stub
     6         System.out.println("rabbit1");
     7     }
     8 
     9     @Override
    10     public void TurnOff() {
    11         // TODO Auto-generated method stub
    12 
    13     }
    14 
    15 }
     1 public class BulbLight implements Light {
     2 
     3     @Override
     4     public void TurnOn() {
     5         // TODO Auto-generated method stub
     6         System.out.println("rabbit2");
     7     }
     8 
     9     @Override
    10     public void TurnOff() {
    11         // TODO Auto-generated method stub
    12 
    13     }
    14 
    15 }

    分别有两个产品类实现这个接口。

    1 public interface Creator {
    2 
    3     public Light factory();
    4     
    5 }

    创建工厂接口,返回值是产品接口。

    1 public class TubeCreator implements Creator{
    2 
    3     @Override
    4     public Light factory() {
    5         // TODO Auto-generated method stub
    6         return new TubeLight();
    7     }
    8 
    9 }
    1 public class BulbCreator implements Creator {
    2 
    3     @Override
    4     public Light factory() {
    5         // TODO Auto-generated method stub
    6         return new BulbLight();
    7     }
    8 
    9 }

    工厂类实现工厂接口,返回与该工厂对应产品的对象。

     1 public class Client {
     2     public static void main(String[] args) {
     3         
     4         Creator create=new BulbCreator();
     5         Light bulblight=create.factory();
     6         bulblight.TurnOn();
     7         
     8         Creator create1=new TubeCreator();
     9         Light tubelight=create1.factory();
    10         tubelight.TurnOn();
    11     }
    12     
    13     
    14 }

    顾客来卖东西了:通过工厂类来生产产品。

    (3)抽象工厂模式:

    1 public abstract class AbstractProductA {
    2 
    3     public abstract void show();
    4 }
    1 public abstract class AbstractProductB {
    2     public abstract void show();
    3 }

    创建两个抽象产品A,B.

     1 public class ProductA extends AbstractProductA{
     2 
     3     @Override
     4     public void show() {
     5         // TODO Auto-generated method stub
     6         System.out.println("A");
     7     }
     8 
     9     
    10 }
    1 public class ProductB extends AbstractProductB{
    2 
    3     @Override
    4     public void show() {
    5         // TODO Auto-generated method stub
    6         System.out.println("B");
    7     }
    8 
    9 }

    两个具体的产品分别继承了它们。

    1 public interface AbstractFactory {
    2 
    3     public AbstractProductA createProductA();
    4     
    5     public AbstractProductB createProductB();
    6 }

    抽象工厂里有两个方法,返回值分别是抽象产品A,抽象产品B.

     1 public class ConcreteFactory implements AbstractFactory{
     2 
     3     @Override
     4     public ProductA createProductA() {
     5         // TODO Auto-generated method stub
     6         return new ProductA();
     7     }
     8 
     9     @Override
    10     public ProductB createProductB() {
    11         // TODO Auto-generated method stub
    12         return new ProductB();
    13     }
    14 
    15 }

    具体的工厂实现了抽象工厂接口。注意:这里的返回值类型不是AbstractProductA 和AbstractProductB。而是它们的儿子ProductA 和 ProductB。 

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         ConcreteFactory f1=new ConcreteFactory();
     5         ProductA a=f1.createProductA();
     6         a.show();
     7         
     8         ConcreteFactory f2=new ConcreteFactory();
     9         ProductB b=f2.createProductB();
    10         b.show();
    11     }
    12 }

    测试类:工厂生产产品。

    二、单例模式的四种写法:

    (1)

     1 public class Single1 {
     2 //不支持多线程
     3     private Single1(){
     4         
     5     }
     6     private static Single1 me;
     7     public static Single1 getInStance(){
     8         if(me==null){
     9             me=new Single1();
    10         }
    11         return me;
    12     }
    13     
    14 }

    (2)

     1 public class Single2 {
     2 //支持多线程,效率低。
     3     private Single2(){
     4         
     5     }
     6     private static Single2 me; 
     7     public static synchronized Single2 getInStance(){
     8         if(me==null){
     9             me=new Single2();
    10         }    
    11         return me;
    12     }
    13     
    14 }

    (3)

     1 public class Single3 {
     2 
     3     private Single3(){
     4         
     5     }
     6     private static class SingletonHolder{
     7         private static final Single3 me=new Single3();
     8     } 
     9     
    10     public static final Single3 getInStance(){
    11         
    12         return SingletonHolder.me;
    13     }    
    14 }

    (4)

     1 public class Single4 {
     2 
     3     private Single4(){
     4         
     5     }
     6     private volatile static Single4 me;
     7     
     8     public static Single4 getInStance(){
     9         if(me==null){
    10             synchronized(Single4.class){
    11                 if(me==null){
    12                     me=new Single4();
    13                 }
    14             }
    15         }
    16         return me;
    17     }
    18     
    19 }

     本贴纯属个人的学习和理解,如有错误望各位大神指正。

  • 相关阅读:
    CSS 导航栏
    CSS 伪元素
    CSS 伪类(Pseudo-classes)
    CSS 组合选择符
    CSS Positioning(定位)
    C# 控制台程序 托盘图标 事件响应
    安装GIT,集成到Powershell中
    Tomcat调优
    CentOS7安装配置redis5集群
    redis.conf配置详细解析
  • 原文地址:https://www.cnblogs.com/CZDblog/p/5532553.html
Copyright © 2011-2022 走看看