设计模式(一)

创建型:
单例模式
工厂方法模式:用一个统一工厂来创建对象,用参数来获取不同对象
工厂方法模式:将工厂也抽象,由具体子类来实现抽象工厂来创建具体对象。
抽象工厂模式:创建一组相关或相互依赖的对象提供一个接口,比如一个产品有形状和颜色2个属性,建立一个抽象工厂来定义这2组相关系的方法,具体子类继承抽象工厂来获取不同颜色不同形状。
建造者模式:用于一个复杂对象的创建
原型模式

1 v1 单例模式

/**
 * 原始的单例模式
 */
class Singleton {
    //一个静态的实例
    private static Singleton singleton;
    //私有化构造函数
    private Singleton(){}
    //给出一个公共的静态方法返回一个单一实例
    public static Singleton getInstance(){
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}
/**
 * 线程安全 1, 不推荐
 */
class BadSynchronizedSingleton {
    //一个静态的实例
    private static BadSynchronizedSingleton synchronizedSingleton;
    //私有化构造函数
    private BadSynchronizedSingleton(){}
    //给出一个公共的静态方法返回一个单一实例
    public synchronized static BadSynchronizedSingleton getInstance(){
        if (synchronizedSingleton == null) {
            synchronizedSingleton = new BadSynchronizedSingleton();
        }
        return synchronizedSingleton;
    }

}
class SynchronizedSingleton {
    //一个静态的实例
    private static SynchronizedSingleton synchronizedSingleton;
    //私有化构造函数
    private SynchronizedSingleton(){}
    //给出一个公共的静态方法返回一个单一实例
    public static SynchronizedSingleton getInstance(){
        if (synchronizedSingleton == null) {
            synchronized (SynchronizedSingleton.class) {
                if (synchronizedSingleton == null) {
                    synchronizedSingleton = new SynchronizedSingleton();
                }
            }
        }
        return synchronizedSingleton;
    }
}
class SingletonInner {
    private SingletonInner(){}
    public static SingletonInner getInstance(){
        return SingletonInstance.instance;
    }
    private static class SingletonInstance{
        static SingletonInner instance = new SingletonInner();
    }
}

2 v2 简单工厂模式

创建对象时,可根据参数来创建不同的对象。
//抽象产品类

public interface IProduct {
 public void method();
}

//具体产品类A

public class ProductA  implements IProduct {
    @Override
    public void method() {
        System.out.println("产品A方法");
    }
}

//具体产品类B

public class ProductB implements  IProduct{
    @Override
    public void method() {
        System.out.println("产品B方法");
    }
}

//简单工厂类

public class Creator {

    private Creator(){}

    public static IProduct createProduct(String productName){
        if (productName == null) {
            return null;
        }
        if (productName.equals("A")) {
            return new ProductA();
        }else if (productName.equals("B")) {
            return new ProductB();
        }else {
            return null;
        }
    }
}

2.1应用

比如如下当一个请求过来时,需要根据参数还做一些操作,
1 登录\注册\登出 或 一个缴费业务: 充电费\水费\燃气费

 //在一个方法里面 用参数来区分 ,处理不同的逻辑,在一个大方法里面,每次新加一个 业务都需要加个 else 判断非常不好
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //我们加入一个操作的参数,来让servlet做出不同的业务处理
    String operation = req.getParameter("operation");
    if (operation.equals("login")) {
        System.out.println("login");
    }else if (operation.equals("register")) {
        System.out.println("register");
    }else if (operation.equals("loginout")) {
        System.out.println("loginout");
    }else {
        throw new RuntimeException("invalid operation");
    }
}

//改进,在原方法根据参数还创建一个service, 具体业务 交给具体的service来操作

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //我们加入一个操作的参数,来让servlet做出不同的业务处理
    String operation = req.getParameter("operation");
    if (operation != null) {
        //这里使用的正是简单工厂模式,创造出一个servlet,然后我们将请求转交给servlet处理
        Servlet servlet = ServletFactory.createServlet(operation);
        servlet.service(servletRequest, servletResponse);
    }else {
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
//创建一个 生产对象的工厂类
public class ServletFactory {
    private ServletFactory(){}
    //一个servlet工厂,专门用来生产各个servlet,而我们生产的依据就是传入的servletName,
    //这个serlvetName由我们在filter截获,传给servlet工厂。
    public static Servlet createServlet(String servletName){
        if (servletName.equals("login")) {
            return new LoginServlet();
        }else if (servletName.equals("register")) {
            return new RegisterServlet();
        }else if (servletName.equals("loginout")) {
            return new LoginoutServlet();
        }else {
            throw new ServletException("unknown servlet");
        }
    }
}

3 v3 工厂方法模式

核心工厂不再生产子类,改成抽象工厂
//抽象产品类

public interface IProduct {
    public void method();
}

//具体产品

public class ProductA implements IProduct {
    @Override
    public void method() {
        System.out.println("产品A方法");
    }
}
public class ProductB implements IProduct {

    @Override
    public void method() {
        System.out.println("产品B方法");
    }
}

//将工厂方法抽象,具体的产品由具体的子工厂生产

public interface Creator {

    public IProduct createProduct();
}

//为每个产品创建具体的工厂

public class ProductACreator implements Creator {
    @Override
    public IProduct createProduct() {
        return null;
    }
}
public class ProductBCreator implements Creator {
    @Override
    public IProduct createProduct() {
        return null;
    }
}

//调用

public class Client {
    public static void main(String[] args) {
        Creator creator = new ProductACreator();
        IProduct product = creator.createProduct();

        creator = new ProductBCreator();
        product = creator.createProduct();
    }
}

3.1简单工厂和工厂方法区别是

工厂方法将工厂类也抽象出来,然后为每个产品都创建一个具体工厂,每次创建产品的时候直接创建具体具体产品的具体工厂,需不采用参数的方式在工厂类里面创造不同的产品。优点:每次创建产品,不用再去修改工厂类,直接创建一个工厂方法继承抽象工厂即可。缺点:工厂方法越来越多。

4 v4 抽象工厂模式

创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
比如创建一个产品,具体有颜色和大小2个属性。
//产品大小和颜色2个抽象类

public interface Size {
   void doSize();
}
public interface Color{
  void doColor();
}

//具体类

public class BigSize implements Shape {
   @Override
   public void doSize() {
      System.out.println("100*100");
   }
}
public class middleSize implements Shape {
   @Override
   public void doSize() {
      System.out.println("50*50");
   }
}
public class smallSize implements Shape {
   @Override
   public void doSize() {
      System.out.println("10*10");
   }
}
public class Red implements Color {
   @Override
   public void doColor() {
      System.out.println("Inside Red::fill() method.");
   }
} 
public class Green implements Color {
   @Override
   public void doColor() {
      System.out.println("Inside Green::fill() method.");
   }
}
public class Blue implements Color {
   @Override
   public void doColor() {
      System.out.println("Inside Blue::fill() method.");
   }
}

//创建这组相关操作的抽象工厂类

public abstract class AbstractFactory {
   abstract Color getColor(String color);
   abstract Shape getSize(String size) ;
}

//创建具体工厂类

public class SizeFactory extends AbstractFactory { 
   @Override
   public Shape getSize(String sizeType){
      if(sizeType == null){
         return null;
      }        
      if(sizeType.equalsIgnoreCase("big")){
         return new Big();
      } else if(sizeType.equalsIgnoreCase("middle")){
         return new Middle();
      } else if(sizeType.equalsIgnoreCase("small")){
         return new Small();
      }
      return null;
   }

   @Override
   Color getColor(String color) {
      return null;
   }
}
public class ColorFactory extends AbstractFactory {   
   @Override
   public Shape getShape(String shapeType){
      return null;
   } 
   @Override
   Color getColor(String color) {
      if(color == null){
         return null;
      }        
      if(color.equalsIgnoreCase("RED")){
         return new Red();
      } else if(color.equalsIgnoreCase("GREEN")){
         return new Green();
      } else if(color.equalsIgnoreCase("BLUE")){
         return new Blue();
      }
      return null;
   }
}

//产品类工厂

public class FactoryProducer {
   public static AbstractFactory getFactory(String choice){
      if(choice.equalsIgnoreCase("size")){
         return new SizeFactory();
      } else if(choice.equalsIgnoreCase("color")){
         return new ColorFactory();
      }
      return null;
   }
}

//应用

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {
      //获取形状工厂
      AbstractFactory sizeFactory = FactoryProducer.getFactory("size");
      //获取形状为 big 的对象
      Size size1 = sizeFactory.getSize("big");
      //调用 Size 的 doSize 方法
      size1.doSize();
      //获取形状为 middle 的对象
      Size size2 = sizeFactory.getShape("middle");
       size2.doSize();

      //获取颜色工厂
      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
      //获取颜色为 Red 的对象
      Color color1 = colorFactory.getColor("RED");
      //调用 Red 的 fill 方法
      color1.doColor();
      //获取颜色为 Green 的对象
      Color color2 = colorFactory.getColor("Green");
      //调用 Green 的 doColor 方法
      color2.doColor();
      //获取颜色为 doColor 的对象
      Color color3 = colorFactory.getColor("BLUE");
      //调用 Blue 的 doColor 方法
      color3.doColor();
   }
}

9 v9创建者模式

建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

9.1 建造者模式结构组成

  • Product: 表示被构造的复杂对象,其中包含需要构建的部件属性。
  • Builder: 创建一个产品对象的各个部件指定抽象接口。
  • ConcreteBuilder: 实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示。
  • Director: 调用具体建造者角色以创建产品对象。
    1.Product:组装一辆汽车首先的有各种配件,如发动机、轮胎、座椅等。
public class Car{
    public String engine;
    public String tyre;
    public String seat;
    public Car(){
    }
    public String getEngine() {
        return engine;
    }
    public void setEngine(String engine) {
        this.engine = engine;
    }
    public String getTyre() {
        return tyre;
    }
    public void setTyre(String tyre) {
        this.tyre = tyre;
    }
    public String getSeat() {
        return seat;
    }
    public void setSeat(String seat) {
        this.seat = seat;
    }
}

2.Builder:定义一个生产配件的抽象建造者接口。

public interface Builder {
    String buildEngine();
    String buildTyre();
    String buildSeat();
} 

3.ConcreteBuilder:实现抽象的 建造者接口生成具体的建造者,并开始生产具体的配件。

public class CarBuilder implements Builder{
    @Override
    public String buildEngine() {
        // 生产发动机
        return "发动机";
    }
    @Override
    public String buildTyre() {
        // 生产轮胎
        return "轮胎";
    }
    @Override
    public String buildSeat() {
        // 生产座椅
        return "座椅";
    }
} 

4.Director:在生产出配件后,由指导者指导组装配件生成汽车。

public class CarDirector {
    CarBuilder cb;
    public CarDirector(CarBuilder cb){
        this.cb=cb;
    }
    public Car constructCar(){
        Car car=new Car();
        car.setEngine(cb.buildEngine());
        car.setTyre(cb.buildTyre());
        car.setSeat(cb.buildSeat());
        return car;
    }
}

5.最终得到一辆汽车:

public class Client {
    public static void main(String[] args) {
        CarDirector carDirector=new CarDirector(new CarBuilder());
        Car car=carDirector.constructCar();        System.out.println(car.getEngine()+car.getTyre()+car.getSeat());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值