设计模式1

设计模式,记得时刻记得解耦的重要性,要考虑以后系统的可扩展性,便于满足往后增加或删改的需求。

1.creational patterns对象的创建
2.structral patterns 类与对象的关系
3.behavioral patterns 对象之间的通信
4.j2ee特别关注表示层

一、工厂模式Factory Pattern

1.将创建实例的能力交给factory类,而不再用new();
不对客户端暴露创建对象的逻辑
2.例子:生产某种手机,先定义手机类接口,再对手机进行分类,如苹果,
三星。创建手机工厂类,在主函数中调用手机工厂类来创建对象。

   //通用手机类接口
  public interface phone(){}
  
   //苹果手机类
   public class Ipone implements phone{
      public success(){
      System.out.println("succesIphone");
      }
   }
   //三星手机类
   public clss samsung implements phone{
       public success(){
      System.out.println("succesSamsung");
      }
   }
   //工厂类
   public class FactoryPhone{
   //static方法
       public static Phone makePhone(string phoneType){
            if(phoneType.equals(Iphone){
             return  new Iphone();
             }
             if(phoneType.equals(samsung){
             return  new samsung();
             }
      }
   }
 }
    //使用工厂类对象来创建手机类的对象,不再需要直接new()
  public class usePhoneFactory{
      public void main(){
         FactoryPhone factoryPhone = new FactoryPhone();
    
         Phone iphone = factoryphone.makePhone(Iphone);
         iphone.success();
    
         Phone samsung = factoryphone.makePhone(samsung);
         samsung.success();
    }
 }
 //当然工厂模式也可以把工厂类抽象化,创建多个不同的具体工厂类再在主函数中调用。
public interface AbstractPhone(){//Phone,Iphone,samsung不变。
     Phone makePhone();
 }

二、抽象工厂模式Abstract Factory Pattern

1.和工厂模式类似,但是工厂模式只能生产手机这种产品,那么如果我们要生产另一种产品,比如电脑。多个产品簇就可以使用抽象工厂模式。
2.使用abstractFactory,因此需要有n个实体化ConcreteabstractFactory的类,我们可以在主函数调用前创建一个FactoryProducer类来封装这些实体化ConcreteAbstractFactory。

//创建一个pc类
public interface Pc(){
     void makePc();
}
//创建一个mac类
public class Mac() implements Pc{
   void successpc(){
    System.out.println("succesMac");
   }
}
创建一个notepad类
public class Notepad() implements Pc{
   void successpc(){
    System.out.println("succesNotepad");
   }
}
//创建一个抽象工厂类
public interface AbstractFactory{
      //创建手机类
      Phone makePhone(String phone);
      //创建pc类
      Pc makePc(String pc);
}

//创建抽象工厂类的实例化,but这么写是不对的。。也不是不对,只是没有解耦,耦合度太高,我们应该分别创建具体工厂类的实体类,如:创建一个phone的工厂实体类,再创建一个pc的工厂实体类
public class Concetefactory implements AbstractFactory{
       public makePhone(String phone){
           if(phone.equals(iphone){
           return  new Iphone()
           }
       }
       public makePc(String pc){
           if(pc.equals(mac){
           return  new mac()
           }
       } 
}

//创建一个pc的工厂实体类
public class ConcreteFactory implements AbstractFactory{
      Phone makePhone(){
      return null;
      }
      //实现pc对象的创建
      public Pc makePc(string pc){
          if(pc.equals(mac){
             return  new Mac();
           }else if(pc.equals(notepad){
             return  new NotePad();
           }else{
           return null;
           }     
      }
//创建一个pc的工厂实体类
public class ConcretePhone implements AbstractFactory{
      //实现phone对象的创建
      public Phone makePhone(String phone){
          if(){
          // ...懒得写了,跟ConcretePc差不多
          }
      }
      public Pc makePc(String pc){
      return null;
      }
}

//创建一个FactoryProducer
public class FactoryProducer {
   public static AbstractFactory chooseFactory(string factory){
       if(factory.equals("pc")){
       return new ConcretePc();
       }
       //if....手机类懒得写了
   }
}

//主函数调用Concrete后的抽象工厂
public void main(){
  psvm(){
    FactoryProducer fp = new FactoryProducer();
    
    AbstractFactory pcFactory = fp.chooseFactory("pc");
    Pc mac = pcFactory .makePc("mac");
    mac.success();
    
    AbstractFactory phonefactory = fp.chooseFactory("phone");
    Phone samsung = phoneFactory .makephone();
    samsung.success();
  }
}

三、单例模式Singleton Pattern

1.懒汉、饿汉、classLoader、枚举
2.枚举好简单。

public User{
   //私有化User的构造方法
   private user(){};

   //枚举类
   static emum SingleToEnum{
      //创建枚举类对象Instance
      Instance;
      //枚举类里可以有变量,有构造方法,有getter/setter方法
      private User use;
      private User(){};
      public void setUser(){
         this.user = user;
       };
      public User getUser(){
         return user;
     }
 
   //一个对外的getUser()的接口方法
   public static User getUser(){
       return SingleToEnum.Instance.getUser();   
   }
}


//创建一个测试类
public class Test{
    psvm{
     //??你在干啥,User构造函数是private的 User user = new User();
      sout(User.getUser());
      sout(User.getUser());//跟上边的打印结果的地址一致
      sout(User.getUser()==User.getUser());//返回true
}
}

四、建造者模式Builder Pattern

https://blog.csdn.net/leikang111/article/details/123927888?spm=1001.2014.3001.5502

https://blog.csdn.net/leikang111/article/details/124107203?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165294607116781685392220%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165294607116781685392220&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~times_rank-1-124107203-null-null.142v10pc_search_result_control_group,157v4control&utm_term=%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
1.首先要明白静态内部类
2.如果某个对象有多个构造参数,类的构造器或工厂中有多个参数,可以考虑使用Builder Pattern
3.如果在设计对象的时候不确定是否有多个参数,也可以考虑Builder Pattern
4.Builder Pattern和Factory Pattern的区别在于Builder会关心对象的初始化顺序和参数之间的组合关系,而Factory只关心能拿到对象。
5.构成

    1)Builder(抽象建造者)
   它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两个方法,一个是BuilderPartX(),如BuilderPartA、BuilderPartB等,他们用于创建对象的各个部件;另一个方法是GetResult(),他们用于返回复杂对象
  
    2)ConcreteBuilder(具体建造者)
   它实现Builder接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品对象

    3)Product(产品)
    它是被构建的复杂对象,包含多个组件,具体建造者创建该产品的内部表示并定义它的装配过程

     4)Director(指挥者)
    它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联,可以在其Constuct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的构建。

6.可以如上述成员构造整个builder pattern,也可以用静态内部类省略builder和director,即直接把builder类当作buildTest静态内部类,director和product省略类

  • 7.钩子方法的引入(?)

创建者模式除了逐步构建一个复杂产品对象外,还可以通过Director类来更加精细地控制产品地创建过程,例如增加一个类称为钩子方法(Hook Method)的特殊方法来控制是否调用某个BuildPartX()方法

钩子方法的返回类型通常为bool类型,方法名一般为IsXXX(),钩子方法定义在抽象建造者类中。例如可以在游戏角色的抽象建造者类ActorBuilder中定义一个方法IsBareheaded(),用于判断某个角色是否为“光头”,在ActorBuilder中为之提供一个默认实现,返回值为false。代码如下:

  • 8.写一下代码

四、适配器模式Adapter Pattern

例如在windows和linux转化中,在windows文件中增加对linux系统的适配
(?)我觉得其实是增加了类

五、装饰器模式Decorator Pattern

向现有对象增加一些功能
(?)我觉得是增加了方法

六、代理模式Proxy Pattern

某对象的访问比较麻烦或比较昂贵,我们提供一个代理对象来访问这个对象
例如windows里的快捷方式
其实就是增加一个中间层,在访问实际对象的时候可以做一些控制

七、观察者模式

耦合的对象之间相互调用,当一个对象状态改变时,将会通知他的依赖对象们。
subject和observe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值