• 设计模式-简单工厂模式


    开闭原则:一个软件实体应该对扩展开放,对修改关闭,也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现 在不修改源代码的情况下改变这个模块的行为。

    创建型模式:将对象的 创建过程 和 使用过程分离,降低耦合,使得软件系统易于扩展。

    简单工厂模式属于创建型模式。

    通过一个例子(权限管理)理解简单工厂模式

    1.客户端有很多人可以登录,身份不同,有员工、经理和管理者。这三者权限不同,但都是客户。所以先创建一个抽象类客户User,再让三个具体类去继承。

    2.员工、经理和管理者称为具体类Employee、Manager、Administrator,有各自的方法。

    3.客户端里实现主函数main,对象的创建必然是在主函数里。

    4.不直接创建对象,通过工厂类UserFactory创建,返回的User对象。具体返回是创建三种具体类对象。

    5.实际开发过程中,会有DAO层,获取账号密码,再通过数据库判断是什么账号,返回员工、经理或管理者的标志,再通过标志传入工厂类获取对象。

     1 package 简单工厂模式;
     2 
     3 public class Client {
     4 
     5     public static void main(String[] args) {
     6         try {
     7             User user;
     8             UserDAO userdao=new UserDAO();
     9             int permisson=userdao.findPermission("zhangsan", "123456");
    10             user=UserFactory.getUser(permisson);//客户端只传入参数,通过工厂创建,不管对象如何创建
    11             user.sameOperation();
    12             user.diffOperation();
    13         }catch(Exception e) {
    14             System.out.println(e.getMessage());
    15         }
    16     }
    17 }
    18 
    19 abstract class User{
    20     public void sameOperation() {
    21         System.out.println("修改个人资料");
    22     }
    23     public abstract void diffOperation();
    24 }
    25 
    26 class Employee extends User{
    27     public Employee() {
    28         System.out.println("创建员工对象");
    29     }
    30     public void diffOperation() {
    31         System.out.println("员工拥有创建假条权限");
    32     }
    33 }
    34 class Manager extends User{
    35     public Manager() {
    36         System.out.println("创建经理对象");
    37     }
    38     public void diffOperation() {
    39         System.out.println("经理拥有创建和审批假条权限");
    40     }
    41 }
    42 class Administrator extends User{
    43     public Administrator() {
    44         System.out.println("创建管理员对象");
    45     }
    46     public void diffOperation() {
    47         System.out.println("经理拥有创建和管理假条权限");
    48     }
    49 }
    50 
    51 class UserFactory {//工厂类,根据逻辑条件返回对象,负责创建对象,这样对象不是在主函数里创建的
    52     public static User getUser(int permisson) {
    53         if(permisson==0)
    54             return new Employee();
    55         else if(1==permisson)
    56             return new Manager();
    57         else if(permisson==2)
    58             return new Administrator();
    59         else 
    60             return null;
    61     }
    62 }//适用于创建对象较少,这样逻辑结构不会太过复杂
    63 //缺点:每加一个产品类,就要修改工厂类,加入必要的逻辑处理,违背了“开闭原则”,通过工厂方法模式改进
    64 
    65 
    66 class UserDAO {//用户表数据访问类(模拟)UserDAO
    67     public int findPermission(String name,String password) {
    68         if(name=="zhangsan"&&password=="123456")
    69             return 0;
    70         else 
    71             return -1;
    72     }
    73 }
    简单工厂模式

     输出:

    创建员工对象
    修改个人资料
    员工拥有创建假条权限

    简言之,将创建对象交给工厂去类去实现,创建对象和使用对象分隔开。

    缺点:每加一个产品类,就要修改工厂类,加入必要的逻辑处理,需要修改源码,违背了“开闭原则”,通过工厂方法模式改进。

  • 相关阅读:
    选择屏幕加功能码
    alv 列标题
    指针引用的学习
    CM3中数据传输对齐/非对齐方式
    perl学习笔记之:模式匹配,模块,文档
    PERL学习之模式匹配
    perl:split函数用法
    perl:_DATA_ _LINE_ _FILE_
    CVS update常用技巧
    cvs 文件无法上传debug
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11642921.html
Copyright © 2020-2023  润新知