设计模式理解创建模式

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

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方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。

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

原文地址:https://www.cnblogs.com/soildong/p/4154285.html