• 设计模式理解创建模式


    创建模式分为:工厂方法模式、抽象工厂模式、建造者模式、单例模式、原型模式。

    1.工厂模式基础:简单工厂模式:

        简单工厂模式的产品是抽象的

       1)先定义产品接口:

    1 public interface Product {
    2     public void displayProduct();//用于显示产品
    3 }

     2)创建简单工厂类:

     1 public class SimpleFactory {
     2     public Product produce(String type){
     3         if( type.equals("A") ) {
     4             return new AProduct();
     5         } else if( type.equals("B") ) {
     6             return new BProduct();
     7         } else {
     8             return null;
     9         }
    10     }
    11 }

        3)定义一个产品:

    1 public class AProduct implements Product{
    2     @Override
    3     public void displayProduct() {
    4         System.out.println("product A");
    5     }
    6 }

        4)使用

     1 public class EasyFactoryMode {
     2     public static void main(String[] args) {
     3         //创建工厂类
     4         SimpleFactory simpleFactory = new SimpleFactory();
     5         //生产产品A
     6         Product a = simpleFactory.produce("A");
     7         //显示        
     8         a.displayProduct();
     9     }
    10 }

    如果要添加一个新产品,需要修改工厂类,修改已有代码,不好。

    2.工厂方法模式

        工厂方法模式的产品和工厂都是抽象的,实例化以后,一个实例化工厂对应一个实例化产品

      1)产品接口

    1 public interface Product {
    2     public void displayProduct();//用于显示产品
    3 }

      2) 工厂接口

    1 public interface Factory {
    2     public Product produce();//生产产品的接口
    3 }

      3)实例化一个产品

    1 public class AProduct implements Product{
    2     @Override
    3     public void displayProduct() {
    4         System.out.println("A product");
    5     }
    6 }

      4)实例化相对应的工厂

    1 public class AFactory implements Factory{
    2     @Override
    3     public Product produce() {
    4         return new AProduct();
    5     }
    6 }

      5)使用

    1 public class Main {
    2     public static void main(String[] args) {
    3         Factory aFactory = new AFactory();//创建工厂A
    4         Product aProduct = aFactory.produce();//生产产品A
    5         aProduct.displayProduct();//显示产品A
    6     }
    7 }

    如果想生产另一种产品,则实例化一个新的产品类和相对应的工厂类即可,不需要修改已有代码。

    3.抽象工厂模式

      当工厂方法模式的抽象产品不是一个,而是多个的时候,就变成了抽象工厂模式。

      1)产品A的接口

    1 public interface ProductA {
    2     public void displayProductA();//用于显示产品
    3 }

      2)产品B的接口

    1 public interface ProductB {
    2     public void displayProductB();//用于显示产品
    3 }

      3)工厂的接口

    1 public interface Factory {
    2     public ProductA produceA();
    3     public ProductB produceB();
    4 }

      4)产品A的实例

    1 public class ProductA_Model1 implements ProductA{
    2     @Override
    3     public void displayProductA() {
    4         System.out.println("ProductA_Model1");
    5     }
    6 }

      5)产品B的实例

    1 public class ProductB_Model1 implements ProductB{
    2     @Override
    3     public void displayProductB() {
    4         System.out.println("ProductB_Model1");
    5     }
    6 }

      6)生产model1的工厂实例

     1 public class FactoryModel1 implements Factory{
     2 
     3     @Override
     4     public ProductA produceA() {
     5         return new ProductA_Model1();
     6     }
     7 
     8     @Override
     9     public ProductB produceB() {
    10         return new ProductB_Model1();
    11     }
    12 
    13 }

      7)使用

    1 public class Main {
    2     public static void main(String [] args){
    3         Factory model1 = new FactoryModel1();
    4         ProductA a = model1.produceA();
    5         a.displayProductA();
    6         ProductB b = model1.produceB();
    7         b.displayProductB();
    8     }
    9 }

    如果想加入一个新型号model2,则只需添加工厂model2实例,产品A和B的model2的实例即可,不需要修改已有代码。

    4.建造者模式

      抽象方法模式的引申:

        1.当产品很多的时候,抽象工厂方法对于使用者来说就过于繁琐了;

        2.当产品生产需要有先后顺序的要求的时候,抽象方法的使用者要知道的东西太多了。

      所以需要一个建造者来专门管生产。

      1)再建立一个产品接口C并实例化

    1 public interface ProductC {
    2     public void displayProduceC();//用于显示产品
    3 }
    1 public class ProductC_Model1 implements ProductC{
    2     @Override
    3     public void displayProduceC() {
    4         System.out.println("ProductC_Model1");
    5     }
    6 }

      2)factory接口要增加生产C产品,并实例化

    1 public interface Factory {
    2     public ProductA produceA();
    3     public ProductB produceB();
    4     public ProductC productC();
    5 }
     1 public class FactoryModel1 implements Factory{
     2 
     3     @Override
     4     public ProductA produceA() {
     5         return new ProductA_Model1();
     6     }
     7 
     8     @Override
     9     public ProductB produceB() {
    10         return new ProductB_Model1();
    11     }
    12 
    13     @Override
    14     public ProductC productC() {
    15         return new ProductC_Model1();
    16     }
    17 
    18 }

      3)builder实现,有生产的个数num,并且有生产顺序 A->C->B

     1 public class BuilderModel1 {
     2     public void produceModel1(int num){
     3         Factory f1 = new FactoryModel1();
     4         for( int i=0; i<num; i++ ) {
     5             ProductA a = f1.produceA();
     6             a.displayProductA();
     7             
     8             ProductC c = f1.productC();
     9             c.displayProduceC();
    10             
    11             ProductB b = f1.produceB();
    12             b.displayProductB();
    13         }
    14     }
    15 }

      4)使用

    1 public class Main {
    2     public static void main(String [] args){
    3         BuilderModel1 builderModel1 = new BuilderModel1();
    4         builderModel1.produceModel1(10);
    5     }
    6 }

    这样对于使用者来说只需要找相应的builder即可,当创建的因素多的时候,有必要抽象出一个builder接口出来。

    5.单例模式

    单例模式是让类自身保存自己的唯一实例.有以下几种:

      1)懒汉模式

     1     public class Singleton {  
     2         private static Singleton instance;  
     3         private Singleton (){}  
     4       
     5         public static Singleton getInstance() {  
     6         if (instance == null) {  
     7             instance = new Singleton();  //延时加载,是在需要的时候才创建对象,所以叫懒汉模式
     8         }  
     9         return instance;  
    10         }  
    11     }  

    由于没有同步,在多线程情况下是不安全的.

      2)饿汉模式

    1     public class Singleton {  
    2         private static Singleton instance = new Singleton();  //在虚拟机启动的时候就会创建,和懒汉模式的区别
    3         private Singleton (){}  
    4         public static Singleton getInstance() {  
    5           return instance;  
    6         }  
    7     }  

    基于classloder机制避免了多线程的同步问题

    6.原型模式, 就像是现实生活中的复印

    原型模式主要用于对象的复制,通过拷贝创建对象分为深拷贝与浅拷贝。

    Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。

    如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。

  • 相关阅读:
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
    ReentrantLock可重入锁
    Lock与synchronized 的区别
    synchronized 与 Lock
    This usually indicates a missing no-arg constructor or that the editor's class name was mistyped in
    Oracle dump 分析secondary key
    java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    Oracle 验证IOT表数据存储在主键里
    Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for U
    Oracle heap 表的主键 dump 分析
  • 原文地址:https://www.cnblogs.com/soildong/p/4154285.html
Copyright © 2020-2023  润新知