单例模式
只能生成一个该类的实例
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized (singleton){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
工厂模式
需要创建大量具有共同接口的实例,并且不同条件下创建不同实例时使用,子类可以根据自己需求创建对应实例
public interface Animal {
public void walk();
public void food();
}
public class Dog implements Animal{
@Override
public void walk() {
System.out.println("狗跑");
}
@Override
public void food() {
System.out.println("狗粮");
}
}
public class Cat implements Animal{
@Override
public void walk() {
System.out.println("猫跳");
}
@Override
public void food() {
System.out.println("猫粮");
}
}
public class Factory {
public static Cat getCat(){
return new Cat();
}
public static Dog getDog(){
return new Dog();
}
}
public class Main {
public static void main(String[] args) {
Animal dog = Factory.getDog();
dog.food();
dog.walk();
Animal cat = Factory.getCat();
cat.walk();
cat.food();
}
}
抽象工厂模式
创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
抽象工厂有点绕,实际上就是把工厂再做成了一个工厂(套娃)。工厂模式是根据需求创建实例,而抽象工厂则是根据需求创建工厂后再根据工厂创建实例
public interface Botany {
public void classify();
public void appearance();
}
public class Willow implements Botany {
@Override
public void classify() {
System.out.println("树");
}
@Override
public void appearance() {
System.out.println("乔木或匍匐状、垫状、直立灌木");
}
}
public class Rose implements Botany {
@Override
public void classify() {
System.out.println("花");
}
@Override
public void appearance() {
System.out.println("小枝密被绒毛,并有针刺和腺毛");
}
}
//再借用上面Animal动物类例子一用
public abstract class AbstractFactory {
public abstract Animal getAnimal(String animal);
public abstract Botany getBotany(String botany) ;
}
public class AnimalFactory extends AbstractFactory {
@Override
public Animal getAnimal(String animal) {
if(animal.equals("cat")){
return new Cat();
}
else if(animal.equals("dog")){
return new Dog();
}
return null;
}
@Override
public Botany getBotany(String botany) {
return null;
}
}
public class BotanyFactory extends AbstractFactory {
@Override
public Animal getAnimal(String animal) {
return null;
}
@Override
public Botany getBotany(String botany) {
if(botany.equals("willow")){
return new Willow();
}
else if(botany.equals("rose")){
return new Rose();
}
return null;
}
}
public class FactoryProducer {
public static AbstractFactory getAnimalFactory(){
return new AnimalFactory();
}
public static AbstractFactory getBotanyFactory(){
return new BotanyFactory();
}
}
public class Main {
public static void main(String[] args) {
/* 获取动物类工厂 */
AbstractFactory abstractFactory = FactoryProducer.getAnimalFactory();
Animal animal = abstractFactory.getAnimal("cat");
animal.food();
animal.walk();
/* 获取植物类工厂 */
abstractFactory = FactoryProducer.getBotanyFactory();
Botany botany = abstractFactory.getBotany("rose");
botany.appearance();
botany.classify();
}
}
观察者模式
对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
/* 观察目标 */
public class Subject {
/* 观察者列表 */
private List<Observer> observers = new ArrayList<>();
private int state;
public int getState() {
return state;
}
/* 该方法中调用了notifyAllObservers()方法,所有只有调用该方法就会自动通知所有观察者 */
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
/* 为观察目标添加观察者 */
public void attach(Observer observer){
observers.add(observer);
}
/* 调用所有观察者的update() */
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
/* 观察者基类 */
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
装饰器模式
创建一个装饰类,包装原有类并在保持方法签名完整性下动态地给该方法添加一些额外的职责
public interface Animal {
public void walk();
public void food();
}
public class Dog implements Animal{
@Override
public void walk() {
System.out.println("狗跑");
}
@Override
public void food() {
System.out.println("狗粮");
}
}
public class Cat implements Animal{
@Override
public void walk() {
System.out.println("猫跳");
}
@Override
public void food() {
System.out.println("猫粮");
}
}
/* 装饰器抽象类 */
public abstract class Decorate {
public Animal animal;
public Decorate(Animal animal){
this.animal = animal;
}
public void food(){
animal.food();
}
}
public class DecorateEx extends Decorate {
public DecorateEx(Animal animal) {
super(animal);
}
@Override
public void food() {
animal.food();
this.getMouse();
}
public void getMouse(){
System.out.println("吃饱开始抓老鼠了...");
}
}
public class Main {
public static void main(String[] args) {
DecorateEx cat = new DecorateEx(new Cat());
cat.food();
DecorateEx dog = new DecorateEx(new Dog());
dog.food();
}
}