资料链接
单例模式:某个类只能有一个实例,提供一个全局的访问点。
简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。
抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。
建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
原型模式:通过复制现有的实例来创建新的实例。
适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。
组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。
装饰模式:动态的给对象添加新的功能。
代理模式:为其他对象提供一个代理以便控制这个对象的访问。
亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。
外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。
模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。
策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。
状态模式:允许一个对象在其对象内部状态改变时改变它的行为。
观察者模式:对象间的一对多的依赖关系。
备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
中介者模式:用一个中介对象来封装一系列的对象交互。
命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。
单例模式
- 懒汉式单例类.在第一次调用的时候实例化自己 (线程不安全)
public class Singleton {
private Singleton() {}
private static Singleton single=null;
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
可以给方法之间加上synchronized保证线程安全,但是会导致很大的性能开销,因为加锁其实只需要在第一次初始化的时候用到,之后的调用都没必要再进行加锁。
双重检测锁+volatile保证线程安全
public class Singleton {
private volatile static Singleton single;
private Singleton() {
}
public Singleton getInstance() {
if (null == single) {
synchronized (Singleton.class) {
if (null == single) {
single = new Singleton(); //flag
}
}
}
return single;
}
}
为什么要加volatile,为了禁止指令重排序
标记为flag的那行,实际上可以分解成以下三个步骤:
- 分配内存空间
- 初始化对象
- 将对象指向刚分配的内存空间
但是有些编译器为了性能的原因,可能会将第二步和第三步进行重排序,这样某些线程会得到一个初始化未完成的对象
- 饿汉式单例类.在类初始化时,已经自行实例化 (线程安全)
public class Singleton {
private Singleton() {}
private static final Singleton single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
简单工厂模式
interface Fruit{
public void buy();
}
class Apple implements Fruit{
public void buy(){
System.out.println("buy apple");
}
}
class Banana implements Fruit{
public void buy(){
System.out.println("buy banana");
}
}
class Orange implements Fruit{
public void buy(){
System.out.println("buy orange");
}
}
class Factory{
public static Fruit produce(String kind){
if(kind.equals("apple"))return new Apple();
else if(kind.equals("banana"))return new Banana();
else return new Orange();
}
}
public class Main{
public static void main(String[] args) {
Fruit fruit= Factory.produce("apple");
fruit.buy();
}
}
工厂方法模式
interface Fruit{
public void buy();
}
class Apple implements Fruit{
public void buy(){
System.out.println("buy apple");
}
}
class Banana implements Fruit{
public void buy(){
System.out.println("buy banana");
}
}
class Orange implements Fruit{
public void buy(){
System.out.println("buy orange");
}
}
interface Factory{
public Fruit produce();
}
class AppleFactory implements Factory{
public Apple produce(){
return new Apple();
}
}
class BananaFactory implements Factory{
public Banana produce(){
return new Banana();
}
}
class OrangeFactory implements Factory{
public Orange produce(){
return new Orange();
}
}
public class Main{
public static void main(String[] args) {
Factory appleFactory=new AppleFactory();
Fruit apple=appleFactory.produce();
apple.buy();
}
}
抽象工厂模式
interface BigFruit{
public void buy();
}
interface SmallFruit{
public void buy();
}
class BigApple implements BigFruit{
public void buy(){
System.out.println("buy Big apple");
}
}
class BigBanana implements BigFruit{
public void buy(){
System.out.println("buy Big banana");
}
}
class BigOrange implements BigFruit{
public void buy(){
System.out.println("buy Big orange");
}
}
class SmallApple implements SmallFruit{
public void buy(){
System.out.println("buy Small apple");
}
}
class SmallBanana implements SmallFruit{
public void buy(){
System.out.println("buy Small banana");
}
}
class SmallOrange implements SmallFruit{
public void buy(){
System.out.println("buy Small orange");
}
}
interface Factory{
public BigFruit produceBig();
public SmallFruit produceSmall();
}
class AppleFactory implements Factory{
public BigApple produceBig(){
return new BigApple();
}
public SmallApple produceSmall(){
return new SmallApple();
}
}
class BananaFactory implements Factory{
public BigBanana produceBig(){
return new BigBanana();
}
public SmallBanana produceSmall(){
return new SmallBanana();
}
}
class OrangeFactory implements Factory{
public BigOrange produceBig(){
return new BigOrange();
}
public SmallOrange produceSmall(){
return new SmallOrange();
}
}
public class Main{
public static void main(String[] args) {
Factory appleFactory=new AppleFactory();
BigFruit bigapple=appleFactory.produceBig();
bigapple.buy();
}
}
建造者模式
public class BuliderTest {
public static void main(String[] args) {
ProductBuilder defaultConcreteProductBulider=new DefaultConcreteProductBulider();
Director director=new Director(defaultConcreteProductBulider);
Product product=director.makeProduct("product1","company1","p1","p2","p3","p4");
System.out.println(product);
}
}
interface ProductBuilder{
void builderProductName(String productName);
void buildercompanyName(String companyName);
void builderPart1(String part1);
void builderPart2(String part2);
void builderPart3(String part3);
void builderPart4(String part4);
Product build();
}
class DefaultConcreteProductBulider implements ProductBuilder{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
@Override
public void builderProductName(String productName) {
this.productName=productName;
}
@Override
public void buildercompanyName(String companyName) {
this.companyName=companyName;
}
@Override
public void builderPart1(String part1) {
this.part1=part1;
}
@Override
public void builderPart2(String part2) {
this.part2=part2;
}
@Override
public void builderPart3(String part3) {
this.part3=part3;
}
@Override
public void builderPart4(String part4) {
this.part4=part4;
}
@Override
public Product build() {
return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
}
}
class Director{
private ProductBuilder builder;
public Director(ProductBuilder builder) {
this.builder = builder;
}
public Product makeProduct(String productName, String companyName, String part1, String part2, String part3, String part4){
builder.builderProductName(productName);
builder.buildercompanyName(companyName);
builder.builderPart1(part1);
builder.builderPart2(part2);
builder.builderPart3(part3);
builder.builderPart4(part4);
return builder.build();
}
}
class Product{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
this.productName = productName;
this.companyName = companyName;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
public Product() {
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getPart1() {
return part1;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public String getPart3() {
return part3;
}
public void setPart3(String part3) {
this.part3 = part3;
}
public String getPart4() {
return part4;
}
public void setPart4(String part4) {
this.part4 = part4;
}
}
装饰器模式
public class DecoratorTest {
public static void main(String[] args) {
Component component=new ConcreteDecorator1(new ConcreteComponent());
component.operation();
}
}
interface Component{
void operation();
}
class ConcreteComponent implements Component{
@Override
public void operation() {
System.out.println("拍照");
}
}
abstract class Decorator implements Component{
Component component;
public Decorator(Component component) {
this.component = component;
}
}
class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component){
super(component);
}
@Override
public void operation() {
System.out.println("添加美颜");
component.operation();
}
}
适配器模式
public class AdapterTest {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target=new Adapter(adaptee);
target.output5v();
}
}
class Adaptee{
public int output220v(){
return 220;
}
}
interface Target{
int output5v();
}
class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public int output5v() {
int i=adaptee.output220v();
System.out.println(String.format("原始电压:%d v-->输出电压:%d v",i,5));
return 5;
}
}
观察者模式
import java.util.ArrayList;
import java.util.List;
public class ObserverTest {
public static void main(String[] args) {
Subject subject=new Subject();
subject.addObserver(new Task1());
Task2 task2=new Task2();
subject.addObserver(task2);
subject.notiyObserver("xxxx");
subject.removeObserver(task2);
subject.notiyObserver("xxxx");
}
}
class Subject{
private List<Observer> container=new ArrayList<>();
public void addObserver(Observer observer){
container.add(observer);
}
public void removeObserver(Observer observer){
container.remove(observer);
}
public void notiyObserver(Object object){
for(Observer observer:container){
observer.update(object);
}
}
}
interface Observer{
void update(Object object);
}
class Task1 implements Observer{
@Override
public void update(Object object) {
System.out.println("task1 received:"+object);
}
}
class Task2 implements Observer{
@Override
public void update(Object object) {
System.out.println("task2 received:"+object);
}
}
外观模式/门面模式
import javax.crypto.Cipher;
public class FacadeTest {
public static void main(String[] args) {
Client1 client1=new Client1();
client1.doSomething();
Client2 client2=new Client2();
client2.doSomething();
}
}
class Client1{
Facade facade=new Facade();
public void doSomething(){
facade.doSomething();
}
}
class Client2{
Facade facade=new Facade();
public void doSomething(){
facade.doSomething();
}
}
class Facade{
SubSystem1 subSystem1=new SubSystem1();
SubSystem2 subSystem2=new SubSystem2();
SubSystem3 subSystem3=new SubSystem3();
public void doSomething(){
subSystem1.method();
subSystem2.method();
subSystem3.method();
}
}
class SubSystem1{
public void method(){
System.out.println("subsystem1.method executed");
}
}
class SubSystem2{
public void method(){
System.out.println("subsystem2.method executed");
}
}
class SubSystem3{
public void method(){
System.out.println("subsystem3.method executed");
}
}