设计模式理解--创建模式
创建模式分为:工厂方法模式、抽象工厂模式、建造者模式、单例模式、原型模式。
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方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。
如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。